调用MFC建立窗口进行绘制的极简版(for greenhands)——单文件
代码如下,有注解。
调试相关,需要自行链接MFC库,引用一下【设置】【连接器】里的对象库模块
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
同时需要注意,在工程选项中,将/subsystem:console改成/subsystem:windows
在微软编译器下,可以跑通。很有爱的简洁版,出自《opengl编程精粹》
#include <windows.h>
static LPCTSTR lpszAppName = "GDI App";
HBRUSH hBlueBrush, hRedBrush;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg; //消息结构
WNDCLASS wc; //窗口类型结构
HWND hWnd; //窗口句柄
hBlueBrush = CreateSolidBrush(RGB(0, 0, 255));
hRedBrush = CreateSolidBrush(RGB(255, 0, 0));
//定义窗口类型
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
//填充
wc.hbrBackground = hBlueBrush;
wc.lpszMenuName = NULL;
wc.lpszClassName = lpszAppName;
//注册窗口类型
if(RegisterClass(&wc) == 0)
return FALSE;
//创建应用主窗口
hWnd = CreateWindow(
lpszAppName,
lpszAppName,
WS_OVERLAPPEDWINDOW,
100, 100,
250, 250,
NULL,
NULL,
hInstance,
NULL
);
//若创建失败,则退出
if(hWnd == NULL)
return FALSE;
//显示窗口
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
//启动消息循环,直至窗口被关闭
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
//分发消息至相应的窗口的消息处理回调函数
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
//程序结束
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HBRUSH hOldBrush;
//开始绘图
BeginPaint(hWnd, &ps);
//选用红色
hOldBrush = (HBRUSH)SelectObject(ps.hdc, hRedBrush);
Rectangle(ps.hdc, 100, 100, 150, 150);
//回复以前画刷
SelectObject(ps.hdc, hOldBrush);
//结束绘制
EndPaint(hWnd, &ps);
}
break;
default:
//将为处理的消息交与Windows默认的处理函数处理
return(DefWindowProc(hWnd, message, wParam, lParam));
}
return(0L);
}