主要过程
1.设计窗口类
2.创建窗口
3.显示刷新窗口
4.消息循环处理(外部定义了消息过程)
#include <Windows.h>
#include <stdio.h>
#include "resource.h"
//声明消息过程
LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
int WINAPI WinMain(
HINSTANCE hInstance, // 我是谁
HINSTANCE hPrevInstance,//谁生的我
LPSTR lpCmdLine, //命令行参数
int nShowCmd //显示状态
)
{
//设计一个窗口类;
WNDCLASS wndcls;
wndcls.cbClsExtra = 0;
wndcls.cbWndExtra = 0;//附加内存空间,一般为0
//GetStockObject 获取已经预定义的窗口标识
wndcls.hbrBackground =(HBRUSH) GetStockObject(BLACK_BRUSH);
//LoadCursor 返回值
wndcls.hCursor = LoadCursor(NULL,IDC_CROSS );
wndcls.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON2));//设置窗口的图标
wndcls.hInstance = hInstance; //所在的程序id是谁,即我自己
wndcls.lpfnWndProc = WinSunProc; //窗口过程函数 类型为 WNDPROC
wndcls.lpszClassName = "hzz";//注册窗口类的名称,CreateWindow时要通过类名来找到该类
wndcls.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); //通过id转换成lpcstr
wndcls.style = CS_HREDRAW | CS_VREDRAW; //窗口样式
RegisterClass(&wndcls);
//创建窗口
HWND hwnd;
hwnd = CreateWindow(
"hzz",
"hzz_window",
WS_OVERLAPPEDWINDOW,//
0,
0,
600,
400,
NULL,
NULL,
hInstance,
NULL
);
if (!hwnd)
{
int x = GetLastError();//通过此方式获取创建窗口失败的原因
int y=0;
}
//显示刷新窗口
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
//定义消息结构体,开始循环
MSG msg;
//GetMessage()从窗口对应的窗口队列中获取该窗口的消息
//hwnd 指接受所属窗口的消息,如果NULL则指线程所属窗口的消息
//后边两个参数分别表示 接受的消息最小值和最大值
while (GetMessage(&msg,NULL,0,0))
{
//将虚拟键消息转换为字符消息。字符消息被送到调用线程的消息队列中,在下一次线程调用函数GetMessage或PeekMessage时被读出。
TranslateMessage(&msg);//
//该函数调度一个消息给窗口程序。通常调度从GetMessage取得的消息。消息被调度到的窗口程序即是WinSunProc()函数。
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(uMsg)
{
case WM_CHAR:
char ch[20];
sprintf_s(ch,"char code is %d",wParam);
MessageBox(hwnd,ch,"char",0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"mouse clicked","caption",0);
HDC hdc;
hdc = GetDC(hwnd);
TextOut(hdc,0,50,"HAH",strlen("HAH"));
//ReleaseDC(hwnd,hdc);
break;
case WM_PAINT:
PAINTSTRUCT ps;
hdc = BeginPaint(hwnd,&ps);
LPWSTR *szArgList;
int argCount;
szArgList = CommandLineToArgvW(GetCommandLineW(),&argCount);
if (!szArgList)
{
MessageBox(NULL,"unable to parse command line","Error",MB_OK);
return -1;
}
for (int i = 0;i<argCount;i++)
{
//MessageBoxW(NULL,szArgList[i],L"haha",MB_OK);
}
//TextOut(hdc,0,0,"paint",strlen("paint"));
EndPaint(hwnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return ::DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}