MFC学习笔记(一)

来源:互联网 发布:无法打开数据库 编辑:程序博客网 时间:2024/04/29 13:10

一:

在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 WINAPIWndProc(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(HWNDhwnd,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);}




0 0
原创粉丝点击