一个简单的windows 程序
#include <Windows.h>
#include <stdio.h>
LRESULT CALLBACK DealEven(
HWND hWnd, // handle to window
UINT Msg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd
)
{
// 创建一个窗口对象(并实例化)
WNDCLASS wc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = DealEven; //重点:指定窗口消息的处理函数
wc.lpszClassName = "Welcome To LM";
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
//注册这个窗口的对象
RegisterClass(&wc);
//创建一个窗口
HWND hwnd= CreateWindow(
wc.lpszClassName, // registered class name
"这是第一个Win32程序", // window name
WS_OVERLAPPEDWINDOW, // window style
0, // horizontal position of window
0, // vertical position of window
600, // window width
600, // window height
NULL, // handle to parent or owner window
NULL, // menu handle or child identifier
wc.hInstance, // handle to application instance
NULL // window-creation data
);
if (hwnd == NULL)
{
return 0;
}
// 显示窗口
ShowWindow(hwnd,SW_SHOWNORMAL);
//更新窗口
UpdateWindow(hwnd);
//接受消息处理
MSG message;
while (GetMessage(&message,hwnd,NULL,NULL))
{
TranslateMessage(&message);//把虚键消息翻译成字符消息(WM_CHAR),
//再把WM_CHAR消息放到消息队列中去
DispatchMessage(&message); //指示操作系统把这条消息发送到窗口
//过程WinProc进行处理
}
return message.wParam;
}
//窗口回调函数,由操作系统调用,程序员
//不要调用,但程序员需要编写其实现代码
LRESULT CALLBACK DealEven(
HWND hWnd, // handle to window
UINT Msg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
LPSTR szstring = "welcome to LM learning C plus plus";
LPSTR szstring_Paint="I get Paint Message";
switch (Msg)
{
case WM_CHAR:
char szChar[20];
sprintf_s(szChar,"你按下了%c键",(char)(wParam));
MessageBox(NULL,szChar,"WM_CHAR",MB_OK);
break;
case WM_LBUTTONDOWN:
HDC hdc;
hdc = GetDC(hWnd);
TextOut(hdc,0,100,szstring,strlen(szstring));
ReleaseDC(hWnd,hdc);
break;
case WM_PAINT:
HDC hdcPaint;
PAINTSTRUCT paint;//画的句柄
hdcPaint = BeginPaint(hWnd,&paint);
TextOut(hdcPaint,0,0,szstring_Paint,strlen(szstring_Paint));
EndPaint(hWnd,&paint);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,Msg,wParam,lParam);
}
}
上面的特别注意的就是别忘记要注册wc这个对象。RegisterClass()就是把定义好的窗口属性向系统进行登记。
WM_DESTROY 是用户单击右上角的关闭按钮来关闭窗口的时候产生的消息,然后调用PostQuitMessage(),这个函数在关闭窗口时候做一些善后处理。
DefWndProc()这个是对用户没有处理的消息默认处理。
#include <Windows.h>
#include <stdio.h>
LRESULT CALLBACK DealEven(
HWND hWnd, // handle to window
UINT Msg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
// 下面对程序进行封装
//定义全局变量
//HINSTANCE hInst;
HWND hwnd;
MSG message;
char lpszClassName []="Welcome To LM" ;
LPSTR szstring = "welcome to LM learning C plus plus";
LPSTR szstring_Paint="I get Paint Message";
ATOM MyRegisterClass(HINSTANCE hInstance); //注册函数 ATOM == unsigned short
BOOL MyCreate(HINSTANCE ,int ); //程序实例化函数
int Run(); //消息循环函数
LRESULT CALLBACK DealEven(
HWND hWnd, // handle to window
UINT Msg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
void OnLButtonDown(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam
);
void OnPaint(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam
);
void OnDestroy(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam
);
void OnChar(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam
);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd
)
{
MyRegisterClass(hInstance); //此处传递hInstance就是为了初始化,wc里面的hInstance
MyCreate(hInstance,nShowCmd);
ShowWindow(hwnd,nShowCmd);
UpdateWindow(hwnd);
return Run();
}
ATOM MyRegisterClass(HINSTANCE hInstance)
{
// 创建一个窗口对象(并实例化)
WNDCLASS wc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = DealEven; //重点:指定窗口消息的处理函数
wc.lpszClassName =lpszClassName ;
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
//注册这个窗口的对象
return RegisterClass(&wc);
}
BOOL MyCreate(HINSTANCE hInstance,int nCmdShow )
{
//创建一个窗口
hwnd= CreateWindow(
lpszClassName, // registered class name
"这是第一个Win32程序", // window name
WS_OVERLAPPEDWINDOW, // window style
0, // horizontal position of window
0, // vertical position of window
600, // window width
600, // window height
NULL, // handle to parent or owner window
NULL, // menu handle or child identifier
hInstance, // handle to application instance
NULL // window-creation data
);
if (hwnd == NULL)
{
return FALSE;
}
return TRUE;
}
int Run()
{
while (GetMessage(&message,hwnd,NULL,NULL))
{
TranslateMessage(&message);//把虚键消息翻译成字符消息(WM_CHAR),
//再把WM_CHAR消息放到消息队列中去
DispatchMessage(&message); //指示操作系统把这条消息发送到窗口
//过程WinProc进行处理
}
return message.wParam;
}
//窗口回调函数,由操作系统调用,程序员
//不要调用,但程序员需要编写其实现代码
LRESULT CALLBACK DealEven(
HWND hwnd, // handle to window
UINT Msg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch (Msg)
{
case WM_CHAR:
OnChar(hwnd, Msg,wParam, lParam );
break;
case WM_LBUTTONDOWN:
OnLButtonDown(hwnd, Msg,wParam, lParam);
break;
case WM_PAINT:
OnPaint(hwnd, Msg,wParam, lParam);
break;
case WM_DESTROY:
OnDestroy(hwnd, Msg,wParam, lParam);
break;
default:
return DefWindowProc(hwnd,Msg,wParam,lParam);
}
}
void OnChar( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
char szChar[20];
sprintf_s(szChar,"你按下了%c键",(char)(wParam));
MessageBox(NULL,szChar,"WM_CHAR",MB_OK);
}
void OnLButtonDown( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
HDC hdc;
hdc = GetDC(hwnd);
TextOut(hdc,0,100,szstring,strlen(szstring));
ReleaseDC(hwnd,hdc);
}
void OnPaint( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
HDC hdcPaint;
PAINTSTRUCT paint;//画的句柄
hdcPaint = BeginPaint(hwnd,&paint);
TextOut(hdcPaint,0,0,szstring_Paint,strlen(szstring_Paint));
EndPaint(hwnd,&paint);
}
void OnDestroy( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
PostQuitMessage(0);
}
BeginPaint()启动绘图,函数TextOut用于在用户绘制文字,函数EndPaint()用于结束绘图操作。