Windows 窗口编程

窗口 HWND 在桌面上显示的一个矩形区域, 它有一个句柄
窗口类 WNDCLASS 一个结构, 设定窗口的内容, 如显示样式, 回调函数, 图标, 光标, 背景色, 菜单等
主函数 WinMain 窗口主线程, 它运行结束窗口即消毁
回调函数 WindowProc 用于处理窗口的所有消息, 有了它程序才能运行
注册窗口类 RegisterClass 没有对应的注册窗口类, 是无法生成窗口的
建立窗口 CreateWindow 使用对应的窗口类生成窗口
显示窗口 ShowWindow 将窗口显示出来
更新窗口 UpdateWindow 刷新窗口区域
获取消息 GetMessage 在主函数中调用, 如果取回 0, 则表示程序要退出了
转换消息 TranslateMessage 主于将按键消息转为字符消息
处理消息 DispatchMessage 它会调用回调函数处理消息

示例:

#include "windows.h"
#include "stdio.h"
#include "resource.h"

// 消息处理过程, 其地址填入 WNDCLASS 结构的 lpfnWndProc 后, 由系统自动调用
LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
	switch(uMsg)
	{
		
	case WM_CHAR:
		char szChar[20];
		sprintf(szChar,"Char code is %d", wParam);
		MessageBox(hwnd, szChar, "char", 0);
		break;
	case WM_LBUTTONDOWN:
		MessageBox(hwnd, "mouse clicked","message", 0);
		
		HDC hdc;
		hdc = GetDC(hwnd);
		TextOut(hdc, 0, 50, "天成数码", strlen("天成数码"));
		ReleaseDC(hwnd, hdc);
		break;
	case WM_PAINT:
		HDC hDC;
		PAINTSTRUCT ps;
		hDC=BeginPaint(hwnd, &ps);
		TextOut(hDC,0,0,"http://www.baidu.com/",strlen("http://www.baidu.com/"));
		EndPaint(hwnd, &ps);
		break;
		
	case WM_CLOSE:
		if( IDYES==MessageBox(hwnd,"退出吗?","message",MB_YESNO))
		{
			DestroyWindow(hwnd);
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	case WM_COMMAND:
		if( wParam==ID_MENUITEM40001 )
		{
			PostMessage(hwnd,WM_CLOSE,0,0);
			break;
		}
	default:
		return DefWindowProc(hwnd,uMsg,wParam,lParam);
	}
	return 0;
}

WNDCLASS aaa;

int WINAPI WinMain(
   HINSTANCE hInstance,
   HINSTANCE hPrevInstance,
   LPSTR lpCmdLine,
   int nCmdShow )
{
	// 填充窗口类初始值
	aaa.style = CS_HREDRAW | CS_VREDRAW ;//| CS_NOCLOSE;
	aaa.lpfnWndProc = WindowProc;
	aaa.cbClsExtra=0;
	aaa.cbWndExtra=0;
	aaa.hInstance = hInstance; 
	aaa.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1) );
	aaa.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1) );
	aaa.hbrBackground = (HBRUSH) GetStockObject( WHITE_BRUSH );
	aaa.lpszClassName="tc2007"; // 关键部位
	aaa.lpszMenuName=0;
	// 注册窗口类
	RegisterClass(&aaa);

	// 建立窗口
	HWND h = CreateWindow( "tc2007","first program",WS_OVERLAPPEDWINDOW,0,0,500,300,NULL,LoadMenu( hInstance, MAKEINTRESOURCE(IDR_MENU1)),hInstance,NULL);

	// 显示和刷新窗口
	ShowWindow(h, nCmdShow );
	UpdateWindow(h);

	// 进入消息循环, 退出则程序也退出
	MSG msg;
	while( GetMessage(&msg, NULL, 0, 0) )
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	
	return msg.wParam;
}