一:
在Win32应用程序中,不用MFC类,如何输出整数
方法一(无效的方法):
MessageBoxA(hwnd,""+nCmdShow,"Test",MB_OK);
方法二(可行):
TCHAR szBuffer[20];
wsprintf(szBuffer, TEXT("大小为: %d"), nCmdShow);
MessageBox(NULL, szBuffer, L"Test", MB_OK);
在MFC中的方法是:
CString str;
str.Format(L"%d",nCmdShow);
MessageBox(str);
二:WinMain函数解析
WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpszCmdLine,int nCmdShow)中的参数hInstance,hPreInstance,nCmdShow是通过系统传入的,lpszCmdLine可以通过命令行传入或者在:项目->属性->调试->命令参数中设置传入。系统传给nCmdShow的值为10,对应窗口显示属性SW_SHOWDEFAULT。
其他窗口显示属性值有:
#define SW_HIDE 0
#define SW_SHOWNORMAL 1
#define SW_NORMAL 1
#define SW_SHOWMINIMIZED 2
#define SW_SHOWMAXIMIZED 3
#define SW_MAXIMIZE 3
#define SW_SHOWNOACTIVATE 4
#define SW_SHOW 5
#define SW_MINIMIZE 6
#define SW_SHOWMINNOACTIVE 7
#define SW_SHOWNA 8
#define SW_RESTORE 9
#define SW_SHOWDEFAULT 10
#define SW_FORCEMINIMIZE 11
#define SW_MAX 11
三:窗口过程函数解析
LONG CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam, LPARAM lParam)
该函数的参数都是通过消息结构msg获得的。MSG的定义如下:
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
#ifdef _MAC
DWORD lPrivate;
#endif
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;
每个消息都记录了相关的窗口hwnd,消息的ID(message)以及参数wParam和lParam等,窗口过程函数的参数就是通过MSG传入的。
测试代码:
//#include "AFX.h"
#include <windows.h>
LONG WINAPI WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,\
LPSTR lpszCmdLine,int nCmdShow)
{
WNDCLASS wc;
HWND hwnd;
MSG msg;
wc.style=0;
wc.lpfnWndProc=(WNDPROC)WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_WINLOGO);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName=NULL;
wc.lpszClassName=L"MyWndClass";
RegisterClass(&wc);
hwnd=CreateWindow(L"MyWndClass",L"SDK Application",WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,\
HWND_DESKTOP,NULL,hInstance,NULL);
//MessageBoxA(hwnd,""+nCmdShow,"Test",MB_OK); //无效
//测试nCmdShow的值和整数如何输出
TCHAR szBuffer[20];
wsprintf(szBuffer, TEXT("大小为: %d"), nCmdShow);
MessageBox(NULL, szBuffer, L"Test", MB_OK);
//测试lpszCmdLine参数的传入
//MessageBoxA(NULL, lpszCmdLine, "Test", MB_OK);
ShowWindow(hwnd,SW_SHOWDEFAULT);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LONG CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,\
LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
Ellipse(hdc,0,0,200,100);
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}