C语言windows编程基础之sdk窗体编写模板
erbi_lucifer吧
全部回复
仅看楼主
level 10
堕erbi 楼主

【C语言windows编程基础之sdk窗体编写模板】



2012年02月24日 10点02分 1
level 10
堕erbi 楼主
这是编写的界面:
不需要像之前的使用资源文件中的dialog对话框……[抱枕]
/***************************************************************************
全过程[傻笑]
***************************************************************************/
001.程序从主函数开始:int WINAPI WinMain()
002.定义窗体:WNDCLASS wndclass
003.定义窗体的属性:那些wndclass.XX=XX的那几句
004.注册窗口类别:RegisterClass (&wndclass)
005.建立窗口:hwnd = CreateWindow()
006.然后在屏幕上显示窗口:ShowWindow ()
UpdateWindow ( )
007.程序进入消息循环:while (GetMessage (&msg, NULL, 0, 0))
008.然后不断从消息队列中取出消息来处理:TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
这些消息会传送到WndProc函数进行处理,在传回来继续循环……直到Close
至于怎样处理那是WndProc函数的事了……
[阿狸侠]
2012年02月24日 10点02分 2
level 10
堕erbi 楼主
/********************************************************************
主函数
*********************************************************************/
详见:https://tieba.baidu.com/p/1420705179 (8楼)
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
return msg.wParam ; //退出的消息,返回这个值给系统,从而退出。
}
2012年02月24日 10点02分 3
level 10
堕erbi 楼主
/********************************************************************
002.定义窗体
*********************************************************************/
WNDCLASS wndclass ; //定义窗体类
就一句,好了,继续003吧……O(∩_∩)O哈哈~
[献花]
2012年02月24日 10点02分 4
level 10
堕erbi 楼主
/********************************************************************
003.定义窗体的属性 [点头]
*********************************************************************/
static TCHAR szAppName[] = TEXT ("HelloWin") ; //定义一个TCHAR型的数组
wndclass.style = CS_HREDRAW | CS_VREDRAW ; //窗体模式,有没最大化, 最小化,关闭等按钮没
wndclass.lpfnWndProc = WndProc //窗口消息处理程序设定为WndProc,我们//定义的那个函数……
wndclass.cbClsExtra = 0 ; //预留的空间。没用到于是设为0
wndclass.cbWndExtra = 0 ; //预留的空间。没用到于是设为0
wndclass.hInstance = hInstance ; //程序的执行实体句柄,它是WinMain的参数之一,程序打开多个时,系统根据这个识别不同的窗体
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; //左上方的图标
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; //鼠标的光标类型
wndclass.hbrBackground= (HBRUSH) GetStockObject (BLACK_BRUSH) ; //背景,将BLACK 换成WHITE试试,就知道了
wndclass.lpszMenuName = NULL ; //窗体没菜单于是是NULL
wndclass.lpszClassName= szAppName ; //我们上面定义的数组,作为窗体的类名

2012年02月24日 10点02分 5
level 10
堕erbi 楼主

/********************************************************************
004.注册窗口类别[数钱]
*********************************************************************/
if (!RegisterClass (&wndclass)) //程序窗口注册窗口类别。不是windowsNT //即不是XP,7之类的操作系统,会注册失败……
{ //不是就弹窗
MessageBox ( NULL, TEXT ("这个程序只能在Windows NT下运行!"), szAppName, MB_ICONERROR) ;
return 0 ;
}
2012年02月24日 10点02分 6
level 10
堕erbi 楼主
/********************************************************************
005.建立窗口:hwnd = CreateWindow() [蛋花哭]……
*********************************************************************/
//开始建立窗体啦…………………[吼叫]………………………………………
hwnd = CreateWindow( szAppName, // 窗体类名,上面定义的那个数组……
TEXT ("程序的标题……~ \\(≥▽≤)/~啦啦啦"), //标题……
WS_OVERLAPPEDWINDOW, // 窗体的类型
CW_USEDEFAULT,// 窗口左上角相对于屏幕左上角的初始位置X
CW_USEDEFAULT,// 窗口左上角相对于屏幕左上角的初始位置Y
CW_USEDEFAULT,// 窗口的宽度,使用了CW_USEDEFAULT标识符,表明希望Windows使用内定尺寸。
CW_USEDEFAULT,// 窗口的高度
NULL, //父窗口句柄(就一个窗体那就为NULL)
NULL, //窗口菜单句柄(木有菜单,为NULL)
hInstance, // 本窗口的句柄
NULL) ; // 指针,指向一个传递给窗体参数值的指针。也就是说带参数运行的参数在这里接收……

2012年02月24日 11点02分 7
level 10
堕erbi 楼主
/********************************************************************
006.在屏幕上显示窗口 [遁]
*********************************************************************/
ShowWindow (hwnd, iCmdShow) ; //显示建立的窗体
UpdateWindow (hwnd) ; //显示
就以上两句, ShowWindow就是显示窗口的了,但它的优先性不高,得用UpdateWindow刷新一下,保证窗体显示。

2012年02月24日 13点02分 8
level 10
堕erbi 楼主

/********************************************************************
007.程序进入消息循环:
*********************************************************************/
MSG msg ; //定义消息结构,在函数WndProc中使用……
while (GetMessage (&msg, NULL, 0, 0))
消息循环-程序现在必须准备读入我们用键盘和鼠标输入的数据。Windows为当前执行的每个Windows程序维护一个「消息队列」。在发生输入事件之后,Windows将事件转换为一个「消息」并将消息放入程序的消息队列中。
GetMessage (MSG结构指针,句柄,过滤消息最小消息号值,过滤消息最大消息号值)
[抱枕]
2012年02月24日 13点02分 9
level 10
堕erbi 楼主

/********************************************************************
008.不断从消息队列中取出消息来处理
*********************************************************************/
TranslateMessage (&msg) ; //将msg结构传给Windows,进行一些键盘转换
DispatchMessage (&msg) ;// 又将msg结构回传给Windows。Windows将该消息发送给适当的窗口消息处理程序,在这里是WndProe函数。处理完传回Windows再传回这里……
以上是主函数的代码,用于创建一个窗体,就像我们在vs2010中添加一个dialog对话框。
下面开始介绍消息处理函数。只有处理这些消息才能运行程序。否则就只有一个动不了退出不了的窗口……
[玩电脑]
2012年02月24日 13点02分 10
level 10
堕erbi 楼主

/********************************************************************
开始消息处理函数……[大笑]
*********************************************************************/
/*窗口消息处理程序是命名为WndProc的函数。窗口消息处理程序可任意命名(只要求不和其它名字发生冲突)。以下是函数WndProc()
第一个参数hwnd是接收消息的窗口的句柄,它与CreateWindow函数的传回值相同。
第二个参数与MSG结构中的message字段相同,它是标识消息的数值。
最后两个参数都是32位的消息参数,提供关于消息的更多信息。*/
/*窗口消息处理程序所接受的每个消息均是用一个数值来标识的,也就是传给窗口消息处理程序的message参数。Windows表头文件WINUSER.H为每个消息参数定义以「WM」(窗口消息)为前缀开头的标识符。于是用swith来判断接收的消息并作出反应*/
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE://初始化窗口的消息
return 0 ;
case WM_PAINT: //重绘窗体,当你移动或改变大小时会传递过来
return 0 ;

2012年02月24日 13点02分 11
level 10
堕erbi 楼主

case WM_DESTROY: //注销窗体
PostQuitMessage (0) ; //导致WinMain退出消息循环,并终止程序。
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
// 窗口消息处理程序不予处理的所有消息应该被传给名为DefWindowProc的Windows函数。从DefWindowProc传回的值必须由窗口消息处理程序传回。
}
在循环里面加入你要处理的消息或删去不需要的消息……于是整个消息处理程序就完成了。
以上就是一个窗体创建的整个过程……这就是SDK编程……[抓狂]
2012年02月24日 13点02分 12
level 10
堕erbi 楼主
/********************************************************************
显示文字,就像我们在拖的标签控件。
*********************************************************************/
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
hdc = BeginPaint (hwnd, &ps) ; //开始重绘
GetClientRect (hwnd, &rect) ; //第一个参数是程序窗口的句柄。第二个参数是一个指标,指向一个RECT型态的rectangle结构。该结构包括4个字段,窗体在屏幕的坐标左上角left,top,右下角right和bottom。
//DrawText可以输出文字(正如其名字所表明的一样)。
DrawText (hdc, TEXT ("在中间显示的文字……O(∩_∩)O哈哈~"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
/*第一个参数是从BeginPaint传回的设备内容句柄
第二个参数是要输出的文字
第三个参数是 -1,指示字符串是以字节0终结的。
最后一个参数是一系列位旗标, 指示了文字必须显示在一行上,水平方向和垂直方向都位于第四个参数指定的矩形中央。*/
EndPaint (hwnd, &ps) ; //结束
/*********************************************************************
以上放在重画窗体的消息处理里面即可。
**********************************************************************/

2012年02月24日 13点02分 13
level 10
堕erbi 楼主

/*********************************************************************
以下是全部代码,建议将其复制粘贴放在文档里,要用到时直接复制出来修改。作为一个模板。
**********************************************************************/
#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground= (HBRUSH) GetStockObject (BLACK_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName= szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox ( NULL, TEXT ("这个程序只能在Windows NT下运行!"), szAppName, MB_ICONERROR) ;
return 0 ;
}
//开始建立窗体啦………………………………………………………………………………
hwnd = CreateWindow( szAppName,
TEXT ("程序的标题……~\\(≥▽≤)/~啦啦啦"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}

2012年02月24日 13点02分 14
今天调试这个错误发现了两个错误:“wndclass.lpfnWndProc = WndProc ”这儿少了一个分号;头文件应加上#include<tchar.h> 呵呵[哈哈]
2016年05月04日 11点05分
level 10
堕erbi 楼主
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
switch (message)
{
case WM_CREATE:
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
DrawText (hdc, TEXT ("在中间显示的文字……O(∩_∩)O哈哈~"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ; //结束
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
[开心][胜利][抖胸][哈哈]……&完成!!!
2012年02月24日 13点02分 15
level 1
怎么在新建的窗口里面添加其他控件啊,不能像对话框那样拖控件嘛。
2012年03月06日 02点03分 16
level 10
堕erbi 楼主
可以用CreateWindow创建控件,但需要先在纸上画出大概样子。然后用CreateWindow,设置好参数即可创建(记得是在WM_CREATE消息里面画按钮,那是窗体初始化的消息)
[揪耳朵]
/*********************************************************************
例子
**********************************************************************/
CreateWindow(TEXT("BUTTON"), //控件"类名称",这里是按钮
TEXT("按钮名称(&B)"),//按钮显示的文字
WS_CHILD | WS_VISIBLE |BS_PUSHBUTTON,//按钮的相关属性
20,//相对于窗体的X坐标
30,//相对于窗体的Y坐标
100, //控件的宽
100,//控件的长
hwnd,//控件所在窗体的句柄
(HMENU)10, //控件ID
((LPCREATESTRUCT) lParam)->hInstance, //实例句柄
NULL);//最后都给个NULL吧!

2012年03月06日 05点03分 17
level 10
堕erbi 楼主
一些控件"类名称"
STATIC :标签
BUTTON :按钮
COMBOBOX :复合框
EDIT :编辑
LISTBOX :列表
RichEdit :Rich Edit version 1.0
RICHEDIT_CLASS :Rich Edit version 2.0
SCROLLBAR :滚动条
[阿狸侠]
2012年03月06日 05点03分 18
level 1
Thanks.好麻烦啊。还是先写写几个基于对话框的来练练先。有问题再来问楼主.[Kiss]
2012年03月06日 06点03分 19
level 1
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc
wndclass.cbClsExtra = 0 ;
这句报错,改了后
Build时候出问题了是什么问题0.0
--------------------Configuration: Text1 - Win32 Debug--------------------
Linking...
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/Text1.exe : fatal error LNK1120: 1 unresolved externals
执行 link.exe 时出错. Text1.exe - 1 error(s), 0 warning(s)
2012年05月12日 08点05分 20
1 2 尾页