记录一下自己的学习内容:一个简易的win32框架
#include "考试2.h"
#include <Windows.h>
#include <Tchar.h>
using namespace std;
//引用系统预定义头文件
//函数声明,包括消息处理函数WndProc,窗口类创建函数WindowsClass,窗口创建函数Windows,对话框消息处理函数
LRESULT WINAPI WndProc(HWND window, UINT message, UINT wParam, LONG lParam);
BOOL WindowsClass(HINSTANCE instance , WCHAR name[]);
BOOL Windows(HINSTANCE instance,HWND& win, int nCmdShow, WCHAR name[]);
BOOL CALLBACK DlgProc(HWND dlg,UINT message, WPARAM wParam, LPARAM lParam);
//定义全局变量,窗口及菜单名字等
WCHAR menu_name[] = _T("menu");
WCHAR win_name[] = _T("考试2");
WCHAR heng[] = _T("横坐标");
WCHAR zong[] = _T("纵坐标");
WCHAR x_position[10];
WCHAR y_position[10];
BOOL position_falg = FALSE;
HINSTANCE instan;
//主函数
int WINAPI WinMain(HINSTANCE instance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND win; //定义窗口句柄
MSG message; //创建消息实例
HACCEL accel; //创建快捷键句柄
if (!WindowsClass(instance,win_name)) //窗口类实例
{
MessageBeep(0);
return FALSE;
}
if (!Windows(instance, win, nCmdShow,win_name)) //创建窗口
{
MessageBeep(0);
return FALSE;
}
instan = instance; //程序实例句柄
accel = LoadAccelerators(instance, menu_name); //加载快捷键资源
while (GetMessage(&message, 0, 0, 0))
{
if (!TranslateAccelerator(win, accel, &message)) //捕获快捷键消息并转换为WM_COMMAND消息,并将该消息加入消息队列,
{ //最终只有非快捷键消息(包括快捷键消息转换的WM_COMMAND消息)才能够被处理
TranslateMessage(&message);
DispatchMessage(&message);
}
}
}
BOOL WindowsClass(HINSTANCE instance, WCHAR name[])
{
WNDCLASS winclass; //定义窗口类实例
winclass.cbClsExtra = 0; //无窗口类扩展.
winclass.cbWndExtra = 0; //无窗口实例扩展.
winclass.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH)); //背景为白色.
winclass.hCursor = LoadCursor(NULL, IDC_ARROW); //窗口采用箭头光标.
winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //采用缺省图标.
winclass.hInstance = instance; //当前应用程序句柄.
winclass.lpfnWndProc = WndProc; //窗口处理函数.
winclass.lpszClassName = name; //窗口类名称,加上_T()是使用Unicode编码
winclass.lpszMenuName = menu_name; //窗口菜单.
winclass.style = 0; //窗口类型为缺省类型.
return RegisterClass(&winclass); //注册窗口类实例,将参数装载进内存
}
BOOL Windows(HINSTANCE instance, HWND& win, int nCmdShow, WCHAR name[])
{
win = CreateWindow( //根据内存中的窗口类实例的参数创建窗口
name, //窗口类名.
name, //标题名.
WS_OVERLAPPEDWINDOW, //带标题栏,最大和最小按钮的窗口.
CW_USEDEFAULT, //窗口左上角坐标.
0,
CW_USEDEFAULT, //采用缺省的宽度和高度.
0,
NULL, //无父窗口.
NULL, //无主菜单.
instance, //当前实例句柄.
NULL); /*CreateWindow会产生一系列的消息交给窗口类实例中指定的消息处理函数处理,
所以必须在消息处理函数的default中调用系统提供的默认系统处理函数,
否则就得自己处理一系列的消息*/
if (!win) return FALSE; //判断创建窗口是否成功
ShowWindow(win, nCmdShow); //显示窗口,同createwindow相同,产生一系列消息
// UpdateWindow(win); //重新绘制窗口,会产生一个WM_PANIT消息,并且不会进入消息队列,而是直接进行处理
return TRUE;
}
LRESULT WINAPI WndProc(HWND window, UINT message, UINT wParam, LONG lParam)
{
HPEN pen;
HDC dc;
HBRUSH br;
PAINTSTRUCT paint;
int x, y;
switch (message)
{
case WM_COMMAND: //处理菜单栏消息
switch (LOWORD(wParam))
{
case ID_START: //按下开始
if (MessageBox(window, _T("Link Start!开始记录鼠标位置"), _T("LINK"), MB_OK) == IDOK) position_falg = TRUE;
InvalidateRect(window, NULL, 1);
break;
case ID_QUIT: //按下退出
DialogBox(instan,_T("Quit"),window,(DLGPROC)DlgProc);
break;
}
break;
case WM_MOUSEMOVE: //鼠标移动时改变坐标显示
x = LOWORD(lParam);
y = HIWORD(lParam);
wsprintf(x_position, _T("%d \0"), x);
wsprintf(y_position, _T("%d \0"), y);
if (position_falg) //只有当开始键按下后才显示坐标
{
dc = GetDC(window);
TextOut(dc, 105, 51, x_position, wcslen(x_position));
TextOut(dc, 255, 51, y_position, wcslen(y_position));
EndPaint(window, &paint);
}
break;
case WM_PAINT: //绘制作为背景的文字和矩形
dc = BeginPaint(window,&paint);
Rectangle(dc, 100, 50, 150, 70);
Rectangle(dc, 250, 50, 300, 70);
TextOut(dc, 50, 50, heng, wcslen(heng));
TextOut(dc, 200, 50, zong, wcslen(zong));
EndPaint(window, &paint);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(window, message, wParam, lParam);
}
return 0;
}
BOOL CALLBACK DlgProc(HWND dlg,UINT message,WPARAM wParam,LPARAM lParam)
{
switch (message) //处理对话框消息
{
case WM_INITDIALOG: //初始化
return 1;
case WM_COMMAND: //处理按钮消息
switch (LOWORD(wParam))
{
case IDOK: //点确定退出程序
PostQuitMessage(0);
break;
case IDNO: //点取消对话框销毁
EndDialog(dlg, 0);
break;
}
break;
case WM_CLOSE: //点叉销毁对话框
EndDialog(dlg, 0);
break;
}
return 0;
}