一、位运算
标志位组合:wParam = MK_RBUTTON|MK_CONTROL|MK_SHIFT
标志位的判断:wParam & MK_LBUTTON
标志位的分离:wParam &= ~MK_RBUTTON;
二、调用约定
__cdecl | _stdcall |
---|---|
是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法 | 是StandardCall的缩写,是C++的标准调用方式 |
a)所有参数从右到左依次入栈 | a)所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针 |
b)这些参数由调用者清除,称为手动清栈。 | b)这些堆栈中的参数由被调用的函数在返回后清除,使用的指令是 retnX,X表示参数占用的字节数,CPU在ret之后自动弹出X个字节的堆栈空间,称为自动清栈。 |
被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。 | 函数在编译的时候就必须确定参数个数,并且调用者必须严格的控制参数的生成,不能多,不能少,否则返回后会出错。 |
三、Unicode转换
a)API:WideCharToMultiByte 与 MultiByteToWideChar
b)使用函数:T2A、W2A,声明标识符 USES_CONVERSION
c)使用_bstr_t类
四、Win32程序模板
#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h>
#include <stdio.h>
#include "resource.h"
//hInstance :资源总管
double GetDlgItemDouble(HWND hwnd, UINT nID)
{char s[256];GetDlgItemText(hwnd, nID, s, sizeof(s));return atof(s);
}
//由字符串转化为整数:atoi 转化为浮点数:atof
//由整数转化为字符串:itoa 浮点数转化为字符串 没有函数(ftoa)
//sprintf函数能将各种类型的数字转化为字符串:格式化函数
void SetDlgItemDouble(HWND hwnd, UINT nID,double db)
{char s[256];sprintf(s,"%lf", db);SetDlgItemText(hwnd, nID, s);
}INT_PTR CALLBACK theProc( HWND hwndDlg,UINT uMsg, WPARAM wParam, LPARAM lParam )
{//消息回调函数switch (uMsg){case WM_COMMAND://命令消息if (LOWORD(wParam) == IDOK){double nLeft = GetDlgItemDouble(hwndDlg, IDC_LEFT1);double nRight = GetDlgItemDouble(hwndDlg, IDC_RIGHT1);SetDlgItemDouble(hwndDlg, IDC_RESULT1, nLeft + nRight);nLeft = GetDlgItemDouble(hwndDlg, IDC_LEFT2);nRight = GetDlgItemDouble(hwndDlg, IDC_RIGHT2);SetDlgItemDouble(hwndDlg, IDC_RESULT2, nLeft - nRight);nLeft = GetDlgItemDouble(hwndDlg, IDC_LEFT3);nRight = GetDlgItemDouble(hwndDlg, IDC_RIGHT3);SetDlgItemDouble(hwndDlg, IDC_RESULT3, nLeft * nRight);nLeft = GetDlgItemDouble(hwndDlg, IDC_LEFT4);nRight = GetDlgItemDouble(hwndDlg, IDC_RIGHT4);if (nRight != 0)SetDlgItemDouble(hwndDlg, IDC_RESULT4, nLeft / nRight);elseSetDlgItemText(hwndDlg, IDC_RESULT4, "除数不能为0");return TRUE;}if (LOWORD(wParam) == IDCANCEL){EndDialog(hwndDlg, IDCANCEL);return TRUE;// MessageBox(hwndDlg, "你点击了Cancel", "临时", 0);}if (LOWORD(wParam) == ID_EXIT){EndDialog(hwndDlg, IDCANCEL);return TRUE;}break;}return FALSE;//FALSE代表缺省的处理由系统完成
}int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrev ,LPSTR lpCmd,int nCmdShow)
{//MessageBox FindWindowDialogBox(hInstance,(LPCTSTR)IDD_MAIN_DLG,NULL, theProc);return 0;
}