利用windows API 进行窗口编程

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);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值