您的位置:首页 > 编程语言

Windows编程学习笔记 lesson2 窗口创建

2017-01-25 13:34 375 查看

窗口

    窗口是windows操作系统应用程序的重要元素,是系统和用户交互的接口。

    窗口中一般包括: 标题栏,菜单,最小化框,客户区

窗口句柄

   窗口被创建后会返回一个句柄来标识该窗口(窗口的id)

Windows程序消息机制

  windows程序是基于事件驱动的程序设计

  windows程序和操作系统的通信都是通过消息来完成,用户有某个动作,操作系统捕获了这个动作,构造一个消息(MSG结构体)加入应用程序中(应用程序的消息队列),应用程序不停地(死循环)从这个消息队列中拿出消息来处理

 消息队列:

  每个应用程序都有一个消息队列,

 程序中的事件都是以一个消息的形式存在被放在消息队列中,程序要通过循环不停地从消息队列中取消息进行相应响应操作

Windows 窗口创建

 设计窗口类、注册窗口类

创建窗口、显示窗口、更新窗口

消息循环

消息处理

消息循环:

  程序要一直运行,必定有死循环(只有当程序退出才结束)

  Windows程序中就是要实现消息循环让程序一直运行

#include <Windows.h>
#include <tchar.h>

//设计窗口类,注册窗口类
void RegisterWndClass();
//窗口过程函数,回调函数,处理消息的
LRESULT CALLBACK MyWndProcFunc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInstance = NULL;

/*
0000 0000 1字节
#define MAX_BOX 0000 0001 定义窗口最大化属性
#defein CLOSE_BOX 0000 0010
style= MAX_BOX | CLOSE_BOX ;0000 0011 有两个属性
style = style & ~MAX_BOX ; 去掉属性
回调函数: 系统自己调用
*/

int WINAPI _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nShowCmd)
{
g_hInstance = hInstance;
//1.设计窗口类,注册窗口类
RegisterWndClass();
//创建窗口
HWND hWnd = CreateWindow(_T("MyWndClass"), _T("wnd"), WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME, 700, 200, 800, 600, NULL, NULL, g_hInstance, NULL);
if (hWnd == NULL)
{
int err = GetLastError();
MessageBox(NULL, _T("窗口创建失败"), _T("错误"), MB_OK);
return 0;
}

//显示更新窗口
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
//消息循环
MSG msg = { 0 };
while (GetMessage(&msg, NULL, 0, 0))//从消息队列中取消息,如果消息队列中没有消息,就一直在这里阻塞,如果获得了WM_QUIT消息,程序返回false
{

TranslateMessage(&msg);
DispatchMessage(&msg);
}

return 1;

}

void RegisterWndClass()
{
//设计窗口类
WNDCLASSEX wndClass;
wndClass.cbClsExtra = 0;//指定紧跟在窗口类结构后的附加字节数,一般初始为0
wndClass.cbSize = sizeof(WNDCLASSEX);//WNDCLASSEX 的大小。
wndClass.cbWndExtra = 0; //指定紧跟在窗口实例的附加字节数。默认为0
wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);//背景画刷的句柄。
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);//光标的句柄。
wndClass.hIcon = NULL;//图标的句柄。
wndClass.hIconSm = NULL;//和窗口类关联的小图标。如果该值为NULL。则把hIcon中的图标转换成大小合适的小图标。

wndClass.hInstance = g_hInstance;//本模块的实例句柄。
wndClass.lpfnWndProc = MyWndProcFunc;//窗口处理函数的指针
wndClass.lpszClassName = _T("MyWndClass");//指向类名称的指针
wndClass.lpszMenuName = NULL;//指向菜单的指针
wndClass.style = CS_HREDRAW | CS_VREDRAW; //从这个窗口类派生的窗口具有的风格

//注册窗口类
RegisterClassEx(&wndClass);

}

LRESULT CALLBACK MyWndProcFunc(HWND hWnd, UINT msgType, WPARAM wParam, LPARAM lParam)

{
switch (msgType)
{
case WM_CREATE:
MessageBox(hWnd, L"创建窗口", L"提示", MB_OK);
break;
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostMessage(hWnd, WM_QUIT, NULL, NULL);
break;
default:
return DefWindowProc(hWnd, msgType, wParam, lParam);
break;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: