噢,我的第一个基于SDK的窗口
昨天看WinMain函数的修饰符WINAPI,看得眩晕,今天专注于WinMain函数的过程也不轻松。为了弄明白一个窗口从创建到销毁的过程,也是大费周章。不过还好,能够看到自己建造的第一个最原始的窗口,总算有了点满足感。创建一个窗口涉及了几个概念:HWND、WNDCLASS(WNDCLASSEX)、RegisterClass(RegisterClassEx)和CreateWindow(CreateWindowEx)。HWND就是Window Handle,它的实质就是一个指针,指向被创建的窗口对象;WNDCLASS(WNDCLASSEX)本身是一个结构体,代表着窗口对象,里面包含了与窗口对象紧密相关的属性;RegisterClass(RegisterClassEx)是用以注册窗口对象的函数;CreateWindow(CreateWindowEx)则是用以创建窗口对象,并且返回一个HWND。其中括号的内容是一一对应,就是说如果定义了WNCLASSEX,就必须用RegisterClassEx去注册,用CreateWindowEx去创建WNDCLASSEX定义的窗口对象。
创建一个看得见摸得着的窗口,主要有以下四步:
1、利用WNDCLASS(WNDCLASSEX)定义窗口对象;
2、调用RegisterClass(RegisterClassEx)函数注册窗口对象;
3、调用CreateWindow(CreateWindowEx)方法创建已经定义并且注册的窗口对象;
4、定义负责处理消息队列的Window Procedure。
以下为一个很简单的例子:
<div style="padding-right: 5.4pt; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; width: 98%; padding-top: 4px;">http://www.agoit.com/Images/OutliningIndicators/None.gif#include <windows.h>
http://www.agoit.com/Images/OutliningIndicators/None.gifLRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wparam, LPARAM lparam);
http://www.agoit.com/Images/OutliningIndicators/None.gif
http://www.agoit.com/Images/OutliningIndicators/None.gifint WINAPI WinMain(HINSTANCE hinstance,
HINSTANCE hprevinstance,LPSTR lpcmdline,int ncmdshow)
http://www.agoit.com/Images/OutliningIndicators/ExpandedBlockStart.gifhttp://www.agoit.com/Images/OutliningIndicators/ContractedBlock.gifhttp://www.agoit.com/Images/dot.gif{
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gifhttp://www.agoit.com/Images/OutliningIndicators/ContractedSubBlock.gif WNDCLASSEX winclass = http://www.agoit.com/Images/dot.gif{0};
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif HWND hwnd;
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif MSG msg;
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gifwinclass.cbSize = sizeof(WNDCLASSEX);
http://www.agoit.com/Images/OutliningIndicators/InBlock.gifwinclass.style = CS_HREDRAW | CS_VREDRAW;
http://www.agoit.com/Images/OutliningIndicators/InBlock.gifwinclass.lpfnWndProc = WindowProc;
http://www.agoit.com/Images/OutliningIndicators/InBlock.gifwinclass.hInstance = hinstance;
http://www.agoit.com/Images/OutliningIndicators/InBlock.gifwinclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
http://www.agoit.com/Images/OutliningIndicators/InBlock.gifwinclass.lpszClassName = "WinInit";
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gifRegisterClassEx(&winclass);
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif
http://www.agoit.com/Images/OutliningIndicators/InBlock.gifhwnd = CreateWindowEx(NULL, "WinInit", "First Window",
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0,
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif 200, 200, NULL, NULL, hinstance, NULL);
http://www.agoit.com/Images/OutliningIndicators/InBlock.giffor(;;)
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gifhttp://www.agoit.com/Images/OutliningIndicators/ContractedSubBlock.gif http://www.agoit.com/Images/dot.gif{
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockStart.gifhttp://www.agoit.com/Images/OutliningIndicators/ContractedSubBlock.gif http://www.agoit.com/Images/dot.gif{
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif if (msg.message == WM_QUIT)
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif break;
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif TranslateMessage(&msg);
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif DispatchMessage(&msg);
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif }
http://www.agoit.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif }
http://www.agoit.com/Images/OutliningIndicators/InBlock.gifreturn(msg.wParam);
http://www.agoit.com/Images/OutliningIndicators/ExpandedBlockEnd.gif}
http://www.agoit.com/Images/OutliningIndicators/None.gif
http://www.agoit.com/Images/OutliningIndicators/None.gifLRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wparam, LPARAM lparam)
http://www.agoit.com/Images/OutliningIndicators/ExpandedBlockStart.gifhttp://www.agoit.com/Images/OutliningIndicators/ContractedBlock.gifhttp://www.agoit.com/Images/dot.gif{
http://www.agoit.com/Images/OutliningIndicators/InBlock.gif return DefWindowProc(hwnd, msg, wparam, lparam);
http://www.agoit.com/Images/OutliningIndicators/ExpandedBlockEnd.gif}
页:
[1]