惧留孙网

juliusun.com

惧留孙网 > 在线教程 > WIN32 SDK教程

Windows窗体的创建

  Windows窗体的创建分为4步:注册窗口类、创建窗口、显示窗口、消息循环。

  注册窗口类:这一步对于初学者有点复杂。注册窗口类主要任务有:定义窗口消息处理函数、完善窗口类结构体、调用RegisterClassEx完成注册。

  定义窗口消息处理函数,我们定义如下:
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_CLOSE:
            DestroyWindow(hWnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}

  上述代码讲解:LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)这是系统规定的窗口消息处理函数的原型,必须这样写。参数hWnd是消息所属窗口的窗口句柄。uMsg是消息类型。wParam和lParam是消息的两个附加参数,这两个附加参数我们当前代码没有用到,以后讲解。

  switch用来判断消息uMsg,当消息为WM_CLOSE时,则视为用户点击窗口的关闭按钮,此时我们调用DestroyWindow销毁窗口。当消息为WM_DESTROY时,代表窗口资源将要销毁,我们此时调用PostQuitMessage函数来向程序发送WM_QUIT消息,程序退出消息循环。如果消息不是两个消息,我们交给窗口默认处理函数DefWindoweProc来处理,注意,不处理的消息一定要交给它。

  完善窗口类结构体。
TCHAR strTitle[] = TEXT("惧留孙课堂");
TCHAR strWndClass[] = TEXT("testclass");

WNDCLASSEX w;
w.cbClsExtra = 0;    //一般为0
w.cbWndExtra = 0;    //一般为0
w.cbSize = sizeof(w);    //结构体大小
w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);    //背景颜色,此时设置成白色
w.hCursor = LoadCursor(NULL, IDC_ARROW);    //光标句柄
w.hIcon = LoadIcon(NULL, IDI_APPLICATION);    //窗口标题栏图标
w.hIconSm = w.hIcon;    //窗口标题栏小图标
w.hInstance = hInstance;    //实例句柄,来自WinMain中的参数
w.lpfnWndProc = WndProc;    //窗口事件处理函数,注意函数名必须与我们定义的函数名一致
w.lpszClassName = strWndClass;    //窗口类名,创建窗口时,要指定窗口类名,须与此一致
w.lpszMenuName = NULL;    //菜单资源,设置为NULL
w.style = CS_DBLCLKS;    //风格,设置为接收双击消息

  调用RegisterClassEx完成窗口注册,API函数RegisterClassEx成功返回非0值,失败返回0。
if (0 == RegisterClassEx(&w))
{
    return 1;
}

  创建窗口:
HWND hWnd=CreateWindowEx(0, strWndClass/*窗口类名,创建前必须注册过*/, strTitle/*标题*/,
        WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX/*风格*/,
        200/*窗口相对于屏幕横座标*/, 100/*竖座标*/, 900/*宽度*/, 500/*高度*/, NULL, NULL, hInstance, NULL);
if (NULL == hWnd)
{
    return 1;
}

  注意,窗口座标单位是像素,屏幕左上角像素点为0,0,Y座标随着屏幕向右移而增加,X座标随着屏幕向下而增加。

  显示窗口
ShowWindow(hWnd, SW_NORMAL);//显示窗口
UpdateWindow(hWnd);//更新窗口

  消息循环
MSG Msg;
while (GetMessage(&Msg, NULL, 0, 0))/*GetMessage收到WM_QUIT消息时返回FALSE*/
{
    TranslateMessage(&Msg);/*翻译消息*/
    DispatchMessage(&Msg);/*分配消息*/
}

  以上代码使用TCHAR类型,ANSI和UNICODE版本可相应推测。大概过程讲完了,细节问题以后再详细说明。

  总结:

1、注册窗口类--窗口的背景、图标、消息处理函数等   定义WNDCLASSEX变量、窗口消息处理函数、调用RegisterClassEx等
2、创建窗口--窗口大小、标题、位置等调用CreateWindowEx
3、显示(更新)窗口 --以何种方式(正常、最大化等)调用ShowWindow(及UpdateWindow)
4、消息循环--获取、翻译、分配消息调用GetMessage等

  /*个人总结,非标准教材,仅供初学理解参考*/
  窗口效果图:

窗口

  代码:

UNICODE编码源码地址:9unicode.php
TCHAR编码源码地址:9tchar.php
ANSI编码源码地址:9ansi.php
视频教程

作者QQ:3304576112  交流QQ群:316930386 C语言窗口程序学习群 本教程内容由 juliusun.com 保留版权,请匆复制传播。

上一页  目录  下一页
抖音
©2015-2024 惧留孙网 juliusun.com

京ICP备15039193号-1

首页 教程 下载 文章 聊天 我的