#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPreInstance,
LPSTR lpSmdLine, //command line
int nCmdShow //show state
)
{
//(1)design a window
WNDCLASS wnd;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
//这两个参数规定类的额外需要的保存的空间的大小值,就好像你设计了一个窗口类
//然后定义了一个窗口的基本特征之后,还想把这个类进行个性化处理
//比如说你想用一个BOOL标记这个类的对象窗口是否带有背景音乐功能,你的cbClsExtra
//的大小就应该设为sizeof(BOOL)
//然后你的窗口可以指定其有一个保存内存的大小,比如说你想通过一个字符串来指定背景音乐的路径
//这是你的cbWndExtra的值可以设置为一定大小,你的音乐字符串大小不能超过此值
wnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //窗口的背景色
wnd.hCursor = LoadCursor(NULL,IDC_WAIT);
//在Windows中,有各种各样的资源(窗口,图标,光标等),系统在创建这些资源时会为它们分配内存
//并返回标识这些资源的标识号,即句柄。
wnd.hIcon = LoadIcon(NULL,IDI_ERROR);
wnd.hInstance = hInstance; //窗口的句柄
wnd.lpfnWndProc = WinSunProc; //这个函数主要是制定消息处理函数。
wnd.lpszClassName = "zju";
wnd.lpszMenuName = NULL;
wnd.style = CS_HREDRAW | CS_VREDRAW; //表示窗口所能进行的操作。
//(2) register a window
RegisterClass(&wnd);
//(3)create a window
HWND hwnd;
//窗口是通过窗口句柄(HWND)来标识的,要是对某个窗口进行操作时,首先要得到这个窗口的句柄
hwnd = CreateWindow("zju","micropt",WS_OVERLAPPEDWINDOW,0,0,400,400,NULL,NULL,hInstance,NULL);
//(4) show and update a window
ShowWindow(hwnd,SW_SHOW);
UpdateWindow(hwnd);
//(5)Define message structure,Start message loop
MSG msg;
//当GetMessage函数接收到WM_QUIT时,其返回值为假,这样就退出了消息循环
// WM_QUIT是由PostQuitMessage(0)产生的,注意这一系列的调用的关系。
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
//函数功能:该函数将虚拟键消息转换为字符消息。字符消息被寄送到调用线程的消息队列里,当下一次线程调用函数GetMessage或PeekMessage时被读出。
DispatchMessage(&msg);
//函数功能:该函数分发一个消息给窗口程序。通常消息从GetMessage函数获得。消息被分发到回调函数(过程函数),
//作用是消息传递给操作系统,然后操作系统去调用我们的回调函数,也就是说我们在窗体的过程函数中处理消息
//当我们敲击键盘上的某个字符键时,系统会产生WM_KEYDOWN和WM_KEYUP消息,当这两个消息的附加参数(wParam和lParam)包含
//的是虚拟代码和扫描码等消息,而我们在程序中往往需要得到某个字符的ASCII码,TranslateMessage这个函数可以将WM_KEYDOWN和
//WM_KEYUP消息组合转换为一条WM_CHAR消息(该消息的wParam附加参数包含了字符的ASCII码),并将转换后的新消息投递到调用线程的消息
//队列中
}
return msg.wParam;
}
LRESULT CALLBACK WinSunProc(
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 click","Message",0);
HDC hdc;
hdc= GetDC(hwnd);
//设备描述表(Device Context)简称DC
//DC是一个包含设备(物理输出设备,如显示器,以及设备驱动程序)信息的结构体
//在Windows平台下,所有的物理图形操作都是利用DC来完成的。
TextOut(hdc,0,0,"china",strlen("china"));
ReleaseDC(hwnd,hdc);
break;
//当移动窗口时,窗口就会发出WM_PAINT消息
case WM_PAINT:
HDC hDc;
PAINTSTRUCT ps;
hDc = BeginPaint(hwnd,&ps);
TextOut(hDc,0,50,"zhejiang",strlen("zhejiang"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES == MessageBox(hwnd,"Are you want to close your window","NOTICE",MB_YESNO | MB_ICONQUESTION))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
//这个函数主要是接收除了以上消息意外的消息,这样防止消息的漏掉。
}
return 0;
}