SDK小总结

SDK 小结

MSDN 控件消息

https://msdn.microsoft.com/en-us/library/windows/desktop/ms644927(v=vs.85).aspx

MSG 消息结构

typedef struct tagMSG {
HWND hwnd; //接受消息的窗口句柄
UINT message;//消息号
WPARAM wParam; //32位特定值,根据消息号确定
LPARAM lParam; //32位特定值,根据消息号确定
DWORD time; //消息创建时的时间
POINT pt; //消息创建时的鼠标/光标 在屏幕坐标系中的位置
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;

WM_COMMAND(0x111):标准控件通知消息 Edit,Combo,List,Button等

消息源 wParam(高位字) wParam(低位字) lParam
菜单 0 菜单 ID(IDM_) 0
快捷键 1 快捷键 ID(IDM_
) 0
控件 控件定义通知代码 控件 ID 控件窗口句柄

WM_NOTIFY(0X4E):通用控件通知消息List View,Image List,IP Address,Tree View,Toolbar等

消息类型 WPARAM LPARAM
VM_NOTIFY 发生VM_NOTIFY消息的控件ID NMHDR指针

查找窗口句柄:枚举查找

HWND hWnd1 = FindWindow(L"窗口类", 0); //根据类名查找
HWND hWnd2 = FindWindow(0, L"标题"); //根据标题查找
HWND hWnd3 = FindWindow(L"窗口类", L"哈哈"); //根据类名标题名查找
HWND hWnd4= GetDlgItem(hWnd , 控件id); //父窗口句柄+控件id查找
int id=GetDlgCtrlID(hWnd);//根据句柄获取控件id
枚举查找: EnumChildWindows
EnumChildWindows(hcalc, EnumChildProc1,0x96);//最后一个自定义参数
BOOL CALLBACK EnumChildProc1(
In HWND hwnd,
In LPARAM lParam
)
{
int teId = GetDlgCtrlID(hwnd);//获取控件ID
if (teId == lParam) //根据要查找的控件id 获取句柄
{
hgetCalc = hwnd;
return false;
}
return true;
}

设置图标
HICON hNewIcon = LoadIcon(GetModuleHandle(0), MAKEINTRESOURCE(IDI_ICON1));
HICON hOldIcon = (HICON)SetClassLong(hwndDlg, // 设置哪个对话框
GCL_HICON, // 你要改变这个对话框的什么属性
(LONG)hNewIcon);// 设置的新属性值

静态设置图片 Picture Control
1.添加 Picture Control控件
2.修改type 属性为 bitmip
3.设置 center image
4.image 选择图片资源

动态设置图片(更换static 控件中的图片)

//创建static 类型控件
HWND hPicture = CreateWindow(
TEXT("static"),
TEXT(""),
WS_VISIBLE | WS_CHILD | SS_BITMAP | SS_CENTERIMAGE,
7, 10, 420, 260,
hwndDlg,
NULL,
GetModuleHandleW(0), 0);

//设置图片
HBITMAP hBmp = LoadBitmap(GetModuleHandle(0), MAKEINTRESOURCE(IDB_BITMAP2));
SendMessage(hPicture, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBmp);

设置菜单

HMENU hMenu = LoadMenu(g_hInst, MAKEINTRESOURCE(IDR_MENU1));
SetMenu(hWnd, hMenu);

设置进度条
HWND hProgress = GetDlgItem(hWnd, 1000);
for (int i = 0; i < 100; ++i)
{
SendMessage(hProgress, PBM_SETPOS, i, 0);// 设置进度条的进度位置
Sleep(5); // 设置延时
}

SDK 或MFC 中使用高清图片的方法
//双缓冲技术:就是把内容先绘制在内存DC上,最后统一拷贝到界面DC中
//sdk 中使用高清图片的办法 利用了双缓冲,可以省略

include <atlimage.h>

CImage nImage; //cImage 对象
nImage.Load(L"1.jpg"); //载入.jpg 格式图片
HBITMAP hBtm=nImage.Detach(); //获取句柄
HDC hDc = GetDC(hwndDlg); //获取设备DC
HDC hMdc=CreateCompatibleDC(hDc);//创建
SelectObject(hMdc, hBtm); //将图片选入内存DC中
StretchBlt(hDc,0,0, 626, 586, hMdc,0,0, 626, 586, SRCCOPY); //拉伸拷贝

Edit操作
//对 Edit 操作 方法1
wchar_t STem[100] = {};
wchar_t STem1[100] = {};
HWND HIDC_EDIT2= GetDlgItem(hwndDlg, IDC_EDIT2);
SetWindowText(HIDC_EDIT2,L"username"); //设置内容
GetWindowTextW(HIDC_EDIT2, STem,100); //获取内容
//MessageBox(0, STem, 0, 0);
HWND HIDC_EDIT1 = GetDlgItem(hwndDlg, IDC_EDIT1);
SetWindowText(HIDC_EDIT1, L"password");
//对 Edit 操作 方法2:
SetDlgItemText(hwndDlg, IDC_EDIT1,L"哈哈哈");
GetDlgItemText(hwndDlg, IDC_EDIT1, STem,100);
//MessageBox(0, STem, 0, 0);
//对Edit 操作方法 3: 发消息
SendMessage(HIDC_EDIT2, WM_GETTEXT, 100, (LPARAM)STem1);
//MessageBox(0, STem1, 0, 0);
SendMessage(HIDC_EDIT2, WM_SETTEXT, 0, (LPARAM)L"你好");

Combox操作

//对Combox 添加数据 方法1:
wchar_t str[] = L"北京";
wchar_t str1[] = L"上海";
wchar_t ComStr[100];
wchar_t ComStr1[100];
HWND HIDC_COMBO1= GetDlgItem(hwndDlg, IDC_COMBO1);
LRESULT ret= SendMessage(HIDC_COMBO1, CB_ADDSTRING, NULL, (LPARAM)str);
//对 combox 添加数据 方法2: 是方法1 的封装
ComboBox_AddString(HIDC_COMBO1, str1);
ComboBox_SetCurSel(HIDC_COMBO1, 0);//设置默认选项
//对ComboBox 获取数据
GetWindowTextW(HIDC_COMBO1, ComStr, 100); //获取内容()
//GetWindowTextW 也是通过WM_GETTEXT消息 实现的
SendMessage(HIDC_COMBO1, WM_GETTEXT, 100, (LPARAM)ComStr1);//获取内容
//MessageBox(0, ComStr1, 0, 0);

check 控件操作

HWND HIDC_CHECK1= GetDlgItem(hwndDlg, IDC_CHECK1);
HWND HIDC_CHECK2 = GetDlgItem(hwndDlg, IDC_CHECK2);
SendMessage(HIDC_CHECK1, BM_SETCHECK, BST_CHECKED, 0); //设置选中状态
LRESULT num=SendMessage(HIDC_CHECK2, BM_GETCHECK, 0, 0);//获取选中状态 选中为1 未选中为0 不确定 2

radio控件

//radio 注 分组 第一个radio group属性为true 到第二个 radio group属性为true 中间的为一组
HWND HIDC_RADIO6 = GetDlgItem(hwndDlg, IDC_RADIO6);
HWND HIDC_RADIO7 = GetDlgItem(hwndDlg, IDC_RADIO7);
SendMessage(HIDC_RADIO6, BM_SETCHECK, BST_CHECKED, 0);
num=SendMessage(HIDC_RADIO7, BM_GETCHECK, 0, 0);

List 控件

include<CommCtrl.h>

//List 控件 需 设置 list 的View属性为Report(报表)
HWND HIDC_LIST1 =GetDlgItem(hwndDlg, IDC_LIST1);
RECT rt = {};
GetClientRect(HIDC_LIST1, &rt);
LV_COLUMN lc;
lc.mask = LVCF_WIDTH | LVCF_TEXT;
lc.cx = (rt.right - rt.left) / 4;
lc.pszText = L"姓名";
ListView_InsertColumn(HIDC_LIST1, 0, &lc);//通过宏发消息...LVM_INSERT
lc.pszText = L"年龄";
ListView_InsertColumn(HIDC_LIST1, 1, &lc);
lc.pszText = L"籍贯";
ListView_InsertColumn(HIDC_LIST1, 2, &lc);
lc.pszText = L"其他";
ListView_InsertColumn(HIDC_LIST1, 3, &lc);
//插入行 //自动出现滚动条
LV_ITEM li = {};
for (int i = 0; i < 100; i++)
{
li.iItem = i;
ListView_InsertItem(HIDC_LIST1, &li);
ListView_SetItemText(HIDC_LIST1, i, 0, L"李四");
ListView_SetItemText(HIDC_LIST1, i, 1, L"12");
ListView_SetItemText(HIDC_LIST1, i, 2, L"北京");
ListView_SetItemText(HIDC_LIST1, i, 3, L"1");
}
//拓展风格需要额外设置
ListView_SetExtendedListViewStyle(HIDC_LIST1, LVS_EX_FULLROWSELECT);
//List 获取列行值
case WM_NOTIFY: //获取列行值
{
//LPNMITEMACTIVATE
LPNMLISTVIEW temp = (LPNMLISTVIEW)lParam; //WM_NOTIFY 的消息结构 针对listView 和True 控件
if (temp->hdr.code == NM_CLICK&&temp->hdr.idFrom == IDC_LIST1)
{
TCHAR str[100] = {};
ListView_GetItemText(temp->hdr.hwndFrom, temp->iItem, temp->iSubItem, str, 100);
MessageBox(0, str, 0, 0);
}
}

树控件基本操作

HWND HIDC_TREE1 = GetDlgItem(hwndDlg, IDC_TREE1);
TV_INSERTSTRUCT tvins;
tvins.hParent = TVI_ROOT; //指定父节点
tvins.hInsertAfter = TVI_SORT; //指定兄弟节点
tvins.item.mask = TVIF_TEXT; //tvins.item为要插入的内容 TV_ITEMW
//插入根节点
tvins.item.pszText = L"事件1";
HTREEITEM hti = TreeView_InsertItem(HIDC_TREE1, &tvins);
tvins.hParent = hti;
tvins.item.pszText = L"事件1.1";
TreeView_InsertItem(HIDC_TREE1, &tvins);
tvins.item.pszText = L"事件1.2";
TreeView_InsertItem(HIDC_TREE1, &tvins);
tvins.hParent = TVI_ROOT;
tvins.item.pszText = L"事件2";
hti = TreeView_InsertItem(HIDC_TREE1, &tvins);
//插入子节点
tvins.hParent = hti;
tvins.item.pszText = L"事件2.2";
hti = TreeView_InsertItem(HIDC_TREE1, &tvins);
case WM_NOTIFY:
{ //获取树控件的值
LPNMLISTVIEW temp = (LPNMLISTVIEW)lParam; //WM_NOTIFY 的消息结构 针对listView 和True 控件
if (temp->hdr.code == TVN_SELCHANGED&&temp->hdr.idFrom == IDC_TREE1)
{
LPNMTREEVIEW TreeTemp = (LPNMTREEVIEW)lParam;
TVITEM tvi = {};
TCHAR str[100] = {};
tvi.hItem = TreeTemp->itemNew.hItem;//行号 //树没有列 只需行号就行啦
tvi.pszText = str;
tvi.cchTextMax = 1024;
tvi.mask = TVIF_TEXT;
TreeView_GetItem(TreeTemp->hdr.hwndFrom,&tvi);// sendmessage TVM_GETITEM
MessageBox(0, str, 0, 0);
}
}break;

模态对话框和非模态对话框

include <windows.h>

include "resource.h"

INT_PTR CALLBACK DialogProc1(
In HWND hwndDlg,
In UINT uMsg,
In WPARAM wParam,
In LPARAM lParam
)
{
switch(uMsg)
{
case WM_CLOSE:
{
EndDialog(hwndDlg, 0);
return 0;
}
default:break;
}
return 0;
}

INT_PTR CALLBACK DialogProc(
In HWND hwndDlg,
In UINT uMsg,
In WPARAM wParam,
In LPARAM lParam
)
{
switch (uMsg)
{
case WM_NOTIFY:

case WM_INITDIALOG:
{
}break;
case WM_COMMAND:
{
    WORD HiwParam = HIWORD(wParam);//高两字节:控件通码
    WORD LowParam = LOWORD(wParam);//低两字节:控件id

    if (HiwParam== BN_CLICKED&&LowParam== IDC_BUTTON1)
    {
        //MessageBox(0, L"我被点击了", 0, 0);
        //DialogBox  的第一个参数是可以选参数,可填null 但是图片加载可能有问题
        //创建模态对话框
        DialogBox(GetModuleHandle(0), MAKEINTRESOURCE(IDD_DIALOG2), NULL, DialogProc1);

        return 1;
    }
}   break;
case WM_CLOSE:
{
    EndDialog(hwndDlg,0);
    return 0;
}
default:
    break;
}

return 0;

}

INT WINAPI WinMain(In HINSTANCE hInstance, In_opt HINSTANCE hPrevInstance, In LPSTR lpCmdLine, In int nShowCmd)
{
//非模态对话框 需要自建 循环 结构
HWND h1=CreateDialog((HINSTANCE)0x400000, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);
ShowWindow(h1,5); //显示窗口
MSG msg = {};
// 自建消息循环需要收到WM_QUIT消息才会退出循环
while (GetMessage(&msg, NULL, NULL, NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg); //分发消息
}
return 0;
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容