Windows窗口是如何产生的?
Windows窗口到底是如何创建的.脱离了一些IDE开发环境,脱离了应用程序创建向导,我们改如何创建windows视窗程序呢?他到到底是如何产生的?带着这些疑问,我们开始一个一个的了解.
在windows下创建窗口分五步:
a. 创建窗口的消息处理函数(消息处理回调函数)
b. 定义窗口入口函数
c. 注册窗口类
d. 创建窗口,
e. 更新显示窗口
f. 消息循环(循环对窗口的消息队里中的消息做处理)
1. 首先我们要定义窗口程序入口函数WinMain,函数原型如下
int WINAPI WinMain(
HINSTANCE hInstance, // 当前应用程序的实例句柄
HINSTANCE hPrevInstance, // 前一应用程序的实例句柄
LPSTR lpCmdLine, // 命令行参数
int nCmdShow // 窗口一何种方式来显示,也就是显示状态
);
2,定义窗口消息处理函数
LRESULT DefWindowProc(
HWND hWnd, // handle to window
UINT Msg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
3,注册窗口类
ATOM RegisterClass(
CONST WNDCLASS *lpWndClass // class data
);
4,创建窗口
HWND CreateWindow(
LPCTSTR lpClassName, // registered class name
LPCTSTR lpWindowName, // window name
DWORD dwStyle, // window style
int x, // horizontal position of window
int y, // vertical position of window
int nWidth, // window width
int nHeight, // window height
HWND hWndParent, // handle to parent or owner window
HMENU hMenu, // menu handle or child identifier
HINSTANCE hInstance, // handle to application instance
LPVOID lpParam // window-creation data
);
5,更新显示窗口
BOOL UpdateWindow(
HWND hWnd // handle to window
);
BOOL ShowWindow(
HWND hWnd, // handle to window
int nCmdShow // show state
);
6,消息循环,不断从窗口的消息队列中取出消息,进行处理,直到程序要退出时,才结束循环
BOOL GetMessage(
LPMSG lpMsg, // message information
HWND hWnd, // handle to window
UINT wMsgFilterMin, // first message
UINT wMsgFilterMax // last message
);
//下边是一个创建窗口的实例
#include "windows.h"
HINSTANCE g_hInstance=NULL;
BOOL Register(LPWSTR pszClassName);
HWND Create(LPWSTR pszClassName,LPWSTR pszWndName);
VOID Display(HWND hWnd);
VOID MessageLoop();
/************************************************************************/
/* 窗口消息处理函数(此函数为回调函数) */
/************************************************************************/
LRESULT CALLBACK WindowsProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam)
{
switch( nMsg )
{
case WM_SYSCOMMAND: //收到的消息为关闭窗口的消息,则使用PostQuitMessage函数发送消息,是消息循环结束,程序退出.
if( SC_CLOSE == wParam )
{
PostQuitMessage( 0 );
}
break;
}
return DefWindowProc(hWnd,nMsg,wParam,lParam);
}
/************************************************************************/
/* 程序入口函数,由操作系统来调用 */
/************************************************************************/
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR pszCmd,int nShowCmd)
{
g_hInstance=hInstance;
Register(L"MyClass"); //注册窗口类
HWND hWnd=Create(L"MyClass",L"一步一步利用Windows API创建出来的windows窗口"); //创建窗口
Display(hWnd); //更新并显示窗口
MessageLoop(); //进入消息循环,直到收到 PostQuitMessage(0)函数发来的消息,GetMessage函数才会返回False,程序会立即返回并且结束;
return 0;
}
/************************************************************************/
/* 注册窗口类 */
/************************************************************************/
BOOL Register(LPWSTR pszClassName)
{
WNDCLASSEX wce = { 0 };
wce.cbSize = sizeof( wce );
wce.style = CS_HREDRAW|CS_VREDRAW;
wce.lpfnWndProc = WindowsProc;
wce.hIcon = NULL;
wce.hCursor = NULL;
wce.hIconSm = NULL;
wce.hbrBackground = (HBRUSH)(COLOR_WINDOW);
wce.hInstance = g_hInstance;
wce.cbClsExtra = 100;
wce.cbWndExtra = 100;
wce.lpszMenuName = NULL;
wce.lpszClassName = pszClassName;
ATOM nAtom = RegisterClassEx( &wce );
if( 0 == nAtom ){return FALSE;}
return TRUE;
}
/************************************************************************/
/* 创建窗口 */
/************************************************************************/
HWND Create(LPWSTR pszClassName,LPWSTR pszWndName)
{
HWND hWnd = CreateWindowEx( WS_EX_CLIENTEDGE,
pszClassName, pszWndName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, g_hInstance, NULL );
return hWnd;
}
/************************************************************************/
/* 更新并显示窗口 */
/************************************************************************/
VOID Display(HWND hWnd)
{
UpdateWindow(hWnd);
ShowWindow(hWnd,SW_SHOW);
}
/************************************************************************/
/* 消息循环(循环处理消息) */
/************************************************************************/
VOID MessageLoop()
{
MSG msg={0};
while(GetMessage(&msg,NULL,0,0))
{
DispatchMessage(&msg);
}
}