今天找到了windows程序设计一书,想来打开看看学习一下,发现很混乱,原理学的c语言和这个看起来很不象,看一个例子用了很长时间,我把例子中的语句查了一下,并标记上注释这样就好看多了,用c语言开发图形界面要做的东西比较繁琐,不过道理还是比较清晰的,比用工具直接画要理解的清楚多了。
下面看程序吧:
#include
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; //windows消息
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(WHITE_BRUSH); //窗口背景为白色
wndclass.lpszMenuName = NULL; //窗口无菜单
wndclass.lpszClassName = szAppName; //窗口类名为”HelloWin”
/*下面是窗口类的注册*/
if (!RegisterClass(&wndclass)){
/*消息框*/
MessageBox(NULL, TEXT(“This program requires Windows NT!”),szAppName, MB_ICONERROR);
return 0;
}
/*创建窗口,并赋值给窗口句柄*/
hwnd = CreateWindow(szAppName, //窗口类名
TEXT(“第一个窗口”), //窗口标题
WS_OVERLAPPEDWINDOW, //窗口样式
CW_USEDEFAULT, //初始化窗口x坐标
CW_USEDEFAULT, //初始化窗口y坐标,x坐标和y坐标是屏幕左上角,窗口开始处
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;
}
/*窗口处理函数*/
LRESULT CALLBACK WndProc(HWND hwnd, //窗口句柄
UINT message, //窗口所处理的消息
WPARAM wParam, //消息附加参数
LPARAM lParam){ //消息附加参数
HDC hdc; //设备描述表(Device Context)的句柄,设备描述表中记录和此设备相关的各种信息
PAINTSTRUCT ps; //保存了窗口绘制客户区的一些信息,绘制客户区时是否要清除背景色,要更新的客户区的矩形区域的大小等等
RECT rect;
switch (message){
case WM_CREATE: //窗体一生成时产生的系列动作
PlaySound(TEXT(“hellowin.wav”), //指定播放声音的字符串
NULL, //应用程序的实例句柄
SND_FILENAME | SND_ASYNC); //播放标志SND_FILENAME指定了WAVE文件名,SND_ASYNC用异步方式播放声音
return 0;
case WM_PAINT: //WM_PAINT是Windows窗口系统中一条重要的消息,应用程序通过处理该消息实现在窗口上的绘制工作
hdc = BeginPaint(hwnd,&ps); //beginpaint得到一个HDC的句柄和一个PAINTSTRUCT的结构,该结构包含了要重绘的各中信息
GetClientRect(hwnd,&rect);
DrawText(hdc, //DC句柄
TEXT(“windows窗口程序”), //画文本
-1, //指向字符串中的字符数
&rect, //指向结构RECT的指针,其中包含正文将被置于其中的矩形的信息(按逻辑坐标)
DT_SINGLELINE | DT_CENTER | DT_VCENTER); //DT_SINGLELINE只画单行,DT_CENTER文本垂直居中,DT_VCENTER水平居中
EndPaint(hwnd,&ps); //ENDPAINT()函数告诉WINDOWS已经时无效区变为有效,防止WM_PAINT
return 0;
case WM_DESTROY: //该讯息是使用者单击Close按钮或者在程式的系统功能表上选择
PostQuitMessage(0); //调用PostQuitMessage函数退出程序
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}