#win32sdk编程积累经验#

 ## ListView ##
- 创建imagelist HIMAGELIST hi;
HBITMAP hBmp = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BMP_PC));
hi =ImageList_Create(,,ILC_COLOR32|ILC_MASK,,);
ImageList_AddMasked(hi,hBmp,RGB(,,)); - 创建 listveiw并设置风格 DWORD dwStyle =WS_BORDER|LVS_ALIGNTOP| LVS_REPORT | LVS_SINGLESEL |WS_VISIBLE |WS_CHILD |LVS_SHOWSELALWAYS;//LVS_OWNERDRAWFIXED hMAINHostList = CreateWindowEx(WS_EX_WINDOWEDGE, WC_LISTVIEW,NULL,dwStyle,,,,,hwnd,(HMENU)IDC_LISTVIEW_HOSTLIST,hInst,NULL); SetTheme(hMAINHostList, L"ListView", L"Explorer", NULL); ListView_SetExtendedListViewStyleEx(hMAINHostList,LVS_EX_FULLROWSELECT,LVS_EX_FULLROWSELECT);
- 插入列 static WCHAR* wszArryHostListColNames[] = {L"col1",L"col2",...};
LV_COLUMN lvColumn;
lvColumn.mask = LVCF_FMT|LVCF_WIDTH|LVCF_TEXT ;
lvColumn.fmt = LVCFMT_LEFT;
lvColumn.cx = ;
for (int i=;i < ;i++)
{
lvColumn.pszText = wszArryHostListColNames[i];
SendMessage(hMAINHostList,LVM_INSERTCOLUMN,(WPARAM)i,(LPARAM)&lvColumn);
}
// 设置imagelist
ListView_SetImageList(hMAINHostList,hi,LVSIL_STATE);
- 插入行,并设置item LVITEM lvItem={};
lvItem.mask = LVIF_TEXT |LVIF_PARAM |LVIF_STATE;
lvItem.iItem = ;
//lvItem.iSubItem = 0;
lvItem.lParam = (LPARAM)lparam;
lvItem.state = INDEXTOSTATEIMAGEMASK(); // 图标
lvItem.pszText = szText ; // col 0
row = ListView_InsertItem(hListView,&lvItem);
// SetItemData (mask = LVIF_PARAM ; lvItem.lParam = (LPARAM)lparam;)
ListView_SetItem(hM4sterHostList,&lvItem);
// col 1
ListView_SetItemText(hListView,row,,szText); - 消息事件 LRESULT OnNotify(HWND hwnd,int idfrm,NMHDR* pnmhdr)
{
if (idfrm == IDC_LISTVIEW_HOSTLIST )
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pnmhdr);
iHostListSelId = pNMItemActivate->iItem ; if ( pnmhdr->code == NM_RCLICK )
{ if (pNMItemActivate && pNMItemActivate->iItem >-)
{
POINT pt ={};
GetCursorPos(&pt);
HMENU hMenu = GetSubMenu(LoadMenu(hInst,MAKEINTRESOURCE(IDR_MENU_POP)),); TrackPopupMenu(hMenu,,pt.x,pt.y,,hwnd,NULL); } }else if (pnmhdr->code == NM_DBLCLK )
{ }
} return false;
}
- 其他 ## status bar ##
- 创建控件 static int iArryStatusBarParts[] = { ,};
// 1. crate bar
hMAINStatusBar = CreateStatusWindow(WS_BORDER|WS_CHILD|WS_VISIBLE|CCS_BOTTOM|CCS_ADJUSTABLE,L"",hwnd,IDC_STATUSBAR_MAIN);
// 2. set parts
SendMessage(hMAINStatusBar,SB_SETPARTS,sizeof(iArryStatusBarParts),(LPARAM)iArryStatusBarParts); //SendMessage(hMAINStatusBar,SB_SETICON,0,(LPARAM)LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON_RED16)));
// 3. set text and icon SendMessage(hMAINStatusBar,SB_SETTEXT,,(LPARAM)L"1970/01/01 00:00:00 ");
SendMessage(hMAINStatusBar,SB_SETTEXT,,(LPARAM)L" "); ## treeview ##
- 创建控件 // 创建 imaglist
HIMAGELIST hi;
hi =ImageList_Create(,,ILC_COLOR24|ILC_MASK,,);
int ret ;
HBITMAP hBmp = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BMP_INFO24));
ret =ImageList_AddMasked(hi,hBmp,RGB(,,));
// 添加图标
hBmp = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BMP_SHELL24));
ret =ImageList_AddMasked(hi,hBmp,RGB(,,));
hBmp = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BMP_FILE24));
ret =ImageList_AddMasked(hi,hBmp,RGB(,,)); DWORD dwStryle = WS_VISIBLE | WS_CHILD | TVS_HASLINES|TVS_SHOWSELALWAYS/*|TVS_LINESATROOT*/;// remove root-line style
HWND hTree = CreateWindow(WC_TREEVIEW,L"Control Station tree",dwStryle,,,,,hParent,(HMENU)IDC_CS_TREE,hInst,NULL);
if (hTree)
{ TreeView_SetImageList(hTree,hi,TVSIL_NORMAL); WCHAR* lpwszTreeNames[] = {L"tree1",L"tree2",L"tree3"}; TVINSERTSTRUCT ti = {}; ti.item.mask=TVIF_TEXT|TCIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM;
ti.hParent=NULL;
ti.hInsertAfter=TVI_ROOT; for (int i=;i<;i++)
{
ti.item.lParam = i;
ti.item.iSelectedImage= ti.item.iImage=i; ti.item.pszText=lpwszTreeNames[i];
TreeView_InsertItem(hTree,&ti);
}
}
- 事件消息 LRESULT OnNotify(HWND hwnd,int idfrm,NMHDR* pnmhdr)
{ if (idfrm == IDC_CS_TREE)
{
if ( pnmhdr->code == TVN_SELCHANGED )
{
// 处理 } } return FALSE ;
} - 其他 // 获取treeveiw当前选中的节点
HTREEITEM hSelected ;
hSelected = TreeView_GetNextItem(hTree,hSelected,TVGN_CARET);
// 获取 treeview的item的 Text\lparam
WCHAR szText[max_path];
TVITEM tvi = {};
tvi.mask = TVIF_TEXT |TVIF_PARAM;// GetTreeItemText \ GetTreeItemData 都可以通过mask指定获取
tvi.pszText = szText;
tvi.cchTextMax = MAX_PATH;
tvi.hItem = hSelected;
TreeView_GetItem(hTree,&tvi); // treeview has childrens 判断是否有子节点(未测试)
TV_ITEM tvitem = {};
tvitem.mask = TVIF_CHILDREN;
tvitem.hItem = hSel ;
TreeView_GetItem(hDirTree,&tvitem);
if (tvitem.cChildren > )
{ } // 删除TREEVIEW的子节点
VOID RemoveTreeviewSubItems(HWND hTree, HTREEITEM hItem)
{
HTREEITEM hSubs = TreeView_GetChild(hTree,hItem);
HTREEITEM hSub= ; while (hSubs)
{
hSub = hSubs ;
hSubs = TreeView_GetNextSibling(hTree,hSubs);
TreeView_DeleteItem(hTree,hSub);
} } // 展开 Treeview节点
TreeView_Expand(lpcs->hDirTree,hTreeItem,TVE_EXPAND); - win32 Treeview 值得参看下 http://blog.csdn.net/c395565746c/article/details/5679357
- 加上[+] [-]图标 TVS_HASBUTTONS http://blog.csdn.net/lifu119/article/details/7024268 ## 托盘图标 ##
- 创建 // GUID gidTrayNotify = {0}; 这2个都是全局的
// static NOTIFYICONDATA nid; gidTrayNotify.Data1 = 0xabcd;
gidTrayNotify.Data2 = 0x1234;
gidTrayNotify.Data3 = 0x2345;
memset(gidTrayNotify.Data4,0xab,); hMAINTrayMenu = LoadMenu(hInst,MAKEINTRESOURCE(IDR_MENU_TRAY));
hMAINTrayMenu = GetSubMenu(hMAINTrayMenu,); nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hwnd ; nid.uID = IDC_TRAYNOTIFY ;
nid.uFlags = NIF_MESSAGE | NIF_ICON |NIF_TIP |NIF_INFO |NIF_GUID;
nid.guidItem = gidTrayNotify ;
nid.hBalloonIcon= nid.hIcon = LoadIcon(hInst,MAKEINTRESOURCE(IDI_MAIN));
nid.uCallbackMessage = WMU_NOTIFY ;
static WCHAR lpwszNotifyTip[] = L"MAIN v1.0";
wcscpy_s(nid.szTip,lpwszNotifyTip);; nid.uTimeout = ;
nid.dwInfoFlags = NIIF_USER | NIIF_LARGE_ICON;
//nid.uVersion = NOTIFYICON_VERSION_4 ;
Shell_NotifyIcon(NIM_ADD,&nid);
- 修改状态 // 这里可以删减的 自行测试删减代码
// 弹气泡 或者 只修改tip信息,需要自行改动
nid.cbSize = sizeof(NOTIFYICONDATA); nid.uFlags = NIF_MESSAGE | NIF_ICON |NIF_TIP |NIF_INFO |NIF_GUID;
nid.guidItem = gidTrayNotify ;
nid.hBalloonIcon= nid.hIcon = LoadIcon(hInst,MAKEINTRESOURCE(IDI_MAIN));
nid.uCallbackMessage = WMU_NOTIFY ;
wcscpy_s(nid.szInfoTitle,L"MAIN Msg ");
wcscpy_s(nid.szInfo,szBuffer);
static WCHAR lpwszNotifyTip[] = L"MAIN v1.0";
wcscpy_s(nid.szTip,lpwszNotifyTip);;
nid.uTimeout = ;
nid.dwInfoFlags = NIIF_USER | NIIF_LARGE_ICON; Shell_NotifyIcon(NIM_MODIFY,&nid); - 删除 nid.uFlags = NIF_GUID ;
nid.guidItem = gidTrayNotify ;
Shell_NotifyIcon(NIM_DELETE,&nid); - 消息事件 // 响应 自定义消息
case WMU_NOTIFY: // custom msg : traynotify
{
MAIN_OnTrayNotify(hWnd,lParam);
}
break; // 处理过程
void MAIN_OnTrayNotify(HWND hWnd, LPARAM lParam)
{
static POINT pos;
switch(lParam)
{
case WM_RBUTTONDOWN:
{
GetCursorPos(&pos);
SetForegroundWindow(hWnd);
TrackPopupMenu(hMAINTrayMenu,TPM_RIGHTBUTTON,pos.x,pos.y,,hWnd,NULL);
}
break;
case WM_LBUTTONDBLCLK:
{
ShowWindow(hWnd,SW_SHOW); }
break; }
} ## 创建dialog的几种姿势##
- CreateDialogParam 不模态,带参数创建diaglog; 在OnInitDialog 中lparam就是传入的参数
- CreateDialog 不模态
- DialogBox 模态
- 以上都存在漂浮于主窗口的缺点,不过够用了
- FILETIME SYSTEMTIME LOCALTIME BOOL FileTimeToSystemTime(
const FILETIME* lpFileTime,
LPSYSTEMTIME lpSystemTime);
FileTimeToSystemTime
LocalFileTimeToFileTime
FileTimeToLocalFileTime
 ## 封装的一些win32小函数 ##
以下函数很多没有测试,只是给出思路。以后用到在改进 - CheckMenuItemX 设置菜单item上的勾选:当开发中来表示某些功能已经开启,通过设置勾选来提示用户 void CheckMenuItemX(HMENU hMenu,UINT id, bool bCheck)
{
CheckMenuItem(hMenu,id,MF_BYCOMMAND | bCheck ? MF_CHECKED : MF_UNCHECKED);
} - LVSetItemData 给ListView项绑定上数据:在开发中我们给某项绑定上数据后,可以在选中此项后轻松获取此项的身份(data);以及自绘时,根据绑定上的数据绘制各个项。 void LVSetItemData(HWND hCtrl,int iItem,LPARAM lpData)
{
LVITEM lvit = {} ;
lvit.mask = LVIF_PARAM ;
lvit.iItem = iItem ;
lvit.lParam = (LPARAM)lpData ; ListView_SetItem(hCtrl,&lvit);
} - LVGetItemData 和 LVSetItemData 对应的作用 LPARAM LVGetItemData(HWND hctrl,int iItem)
{
LVITEM lvit = {} ;
lvit.mask = LVIF_PARAM ;
lvit.iItem = iItem ;
ListView_SetItem(hCtrl,&lvit);
return lvit.lParam ;
}
 - listview 使用分组和缩进

         //创建listview
HWND listview1 = CreateWindowEx(WS_EX_STATICEDGE, TEXT("SysListView32"), NULL, WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_SINGLESEL, , , , , hwnd, (HMENU), (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
ListView_SetExtendedListViewStyle(listview1, LVS_EX_FULLROWSELECT | LVS_EX_SUBITEMIMAGES);//设置listview扩展风格
SendMessage(listview1, WM_SETFONT, (WPARAM)GetStockObject(), ); SetWindowTheme(listview1, L"Explorer", NULL);
SendMessage(listview1, LVM_ENABLEGROUPVIEW, TRUE, );//启用分组支持 RECT rcThis;
GetClientRect(hwnd,&rcThis);
MoveWindow(listview1,,,rcThis.right,rcThis.bottom,TRUE); LVGROUP group1;
group1.cbSize = LVGROUP_V5_SIZE;
group1.mask = LVGF_HEADER | LVGF_GROUPID;
group1.pszHeader = L"组1";
group1.iGroupId = ;
ListView_InsertGroup(listview1, -, &group1); group1.pszHeader = L"组2 - Hello World";
group1.iGroupId = ;
ListView_InsertGroup(listview1, -, &group1); //创建图片列表
HIMAGELIST imglist1 = ImageList_Create(, , ILC_COLOR32, , );
ImageList_AddIcon(imglist1, LoadIcon((HINSTANCE)GetWindowLongPtr(hwnd, GWL_HINSTANCE), MAKEINTRESOURCE(IDI_ICON1)));
ImageList_AddIcon(imglist1, LoadIcon((HINSTANCE)GetWindowLongPtr(hwnd, GWL_HINSTANCE), MAKEINTRESOURCE(IDI_ICON2)));
HICON ico;
ExtractIconEx(L"C:\\Program Files\\Microsoft Visual Studio 14.0\\Common7\\Tools\\spyxx.exe", , &ico, NULL, );
ImageList_AddIcon(imglist1, ico);
ListView_SetImageList(listview1, imglist1, LVSIL_SMALL); LV_COLUMN list1;
LVITEM item1 ;
//内存清零
ZeroMemory(&list1, sizeof(LVCOLUMN));
ZeroMemory(&item1, sizeof(LVITEM)); //创建列
list1.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;//掩码
list1.fmt = LVCFMT_LEFT;//左对齐
list1.cx = ;//列宽
list1.pszText = L"列1";
SendMessage(listview1, LVM_INSERTCOLUMN, , (LPARAM)&list1);//创建列
list1.pszText = L"list2";
list1.cx = ;
SendMessage(listview1, LVM_INSERTCOLUMN, , (LPARAM)&list1);
list1.pszText = L"hello world";
SendMessage(listview1, LVM_INSERTCOLUMN, , (LPARAM)&list1);
list1.pszText = L"happy";
SendMessage(listview1, LVM_INSERTCOLUMN, , (LPARAM)&list1); //创建项目
item1.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_INDENT | LVIF_GROUPID;
item1.pszText = L"项目";
item1.iItem = ;//项目号
item1.iImage = ;//图片号
item1.iIndent = ;
item1.iGroupId = ;
SendMessage(listview1, LVM_INSERTITEM, , (LPARAM)&item1);
item1.iItem = ;
item1.iImage = ;
SendMessage(listview1, LVM_INSERTITEM, , (LPARAM)&item1);
item1.pszText = L"item 3";
item1.iItem = ;
item1.iImage = ;
item1.iIndent = ;//缩进一个图像单位
SendMessage(listview1, LVM_INSERTITEM, , (LPARAM)&item1);
item1.pszText = L"第四个";
item1.iItem = ;
item1.iImage = ;
item1.iIndent = ;
SendMessage(listview1, LVM_INSERTITEM, , (LPARAM)&item1); item1.iGroupId = ;
item1.pszText = L"我在组2内";
item1.iItem = ;
item1.iImage = ;
item1.iIndent = ;
SendMessage(listview1, LVM_INSERTITEM, , (LPARAM)&item1);
item1.pszText = L"item 5";
item1.iItem = ;
item1.iImage = ;
item1.iIndent = ;
SendMessage(listview1, LVM_INSERTITEM, , (LPARAM)&item1); //创建子项目
item1.mask = LVIF_TEXT | LVIF_IMAGE;
item1.iItem = ;
item1.iSubItem = ;
item1.iImage = -;
item1.pszText = TEXT("子项目");
SendMessage(listview1, LVM_SETITEM, , (LPARAM)&item1);
item1.iItem = ;
item1.iSubItem = ;
item1.pszText = TEXT("子项目");
SendMessage(listview1, LVM_SETITEM, , (LPARAM)&item1);
item1.iItem = ;
item1.iSubItem = ;
item1.pszText = TEXT("子项目");
SendMessage(listview1, LVM_SETITEM, , (LPARAM)&item1); - 启用高版本的comctrl支持 #pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

win32sdk 编程整理的些资料的更多相关文章

  1. 【Windows】windows核心编程整理(下)

    windows核心编程整理(上) windows核心编程整理(下) 线程的堆栈 每当创建一个线程时,系统就会为线程的堆栈(每个线程有他自己的堆栈)保留一个堆栈空间区域,并将一些物理存储器提交给这个以保 ...

  2. 【Windows】windows核心编程整理(上)

    小续 这是我11年看<windows核心编程>时所作的一些笔记,现整理出来共享给大家 windows核心编程整理(上) windows核心编程整理(下) 线程的基础知识 进程是不活泼的,进 ...

  3. [整理]FPGA学习资料汇总

    01.特权同学倾情奉献海量FPGA学习资料 http://pan.baidu.com/s/1pJIb32F

  4. 04---XML编程整理

    一.XML概述       XML(eXtensible Markup Language),可扩展标记语言,       被设计的宗旨是传输数据,而非显示数据       W3C发布的,目前遵循1.0 ...

  5. GitHub上整理的一些资料(转)

    技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 infoq:企业级应用,关注软件开发领域 ...

  6. GitHub上整理的一些资料

    技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 infoq:企业级应用,关注软件开发领域 ...

  7. [osg]osgDB的加载机制,使用3DS插件做参考(转,整理现有osgDB资料)

    参考:http://blog.sina.com.cn/s/blog_7cdaf8b60102uzu3.html http://blog.csdn.net/wang15061955806/article ...

  8. sqlserver整理的实用资料

    1 --- 创建 备份数据的 device 2 3 USE DB_ZJ 4 EXEC sp_addumpdevice 'disk', 'testBack', 'c:\MyNwind_1.dat' 5 ...

  9. 整理的Python资料,包含各阶段所需网站、项目,收藏了

    虽然强调过很多次了,但是还是要多提一句,不要看python2.x,如果你是零基础过来的,请直接开始你的py3.x 之路.建议3.6,3.7的一些特性可能对你不是很重要. 1.初出茅庐 我不会推荐你们去 ...

随机推荐

  1. 使用shell测试cdn状态

    公司使用多家cdn,测试cdn在各个地方的响应情况,以便于提高视频访问的用户体验.分别在阿里云华南1,华东1,华东2,华北2等不同地区节点测试.该随笔为自己所用.   1.该脚本会测试某一cdn的ur ...

  2. 图像分割之(三)从Graph Cut到Grab Cut

    zouxy09@qq.com http://blog.csdn.net/zouxy09 上一文对GraphCut做了一个了解,而现在我们聊到的GrabCut是对其的改进版,是迭代的Graph Cut. ...

  3. 智能硬件+App移动新生态【北京、广州、深圳】

    智能硬件+App移动新生态[10.24北京站] 时间:2015年10月24日13:30-16:30 地点:Wepac空间(海淀区北四环西路68号左岸工社6层) 主办:APICloud.机智云.智石科技 ...

  4. [转][C++ 11]override and final - write clean and maintainable C++ code

    原文: http://arne-mertz.de/2015/12/modern-c-features-override-and-final/ Today I write about a pair of ...

  5. css 字体样式

    [强制] font-family 属性中的字体族名称应使用字体的英文 Family Name,其中如有空格,须放置在引号中. 解释: 所谓英文 Family Name,为字体文件的一个元数据,常见名称 ...

  6. linux:档案与目录管理

    几个常见的目录处理命令: cd(change directory):变更目录 pwd(print working directory):显示当前目录[目录为连结档,则只显示连结档的路径]([-P]不以 ...

  7. NHibernate 3.2+的 Map by Code 实例

    NHibernate 3.2+的 Map by Code 的文档真的很少,除了Fabio Maulo的2篇blog(顺带说李永京的翻译,没任何新的研究). 让人感慨NH的没落, 也许从没有流行过. 在 ...

  8. 学习OpenCV——粒子滤波(网上两篇文章总结)

    粒子滤波的理论实在是太美妙了,用一组不同权重的随机状态来逼近复杂的概率密度函数.其再非线性.非高斯系统中具有优良的特性.opencv给出了一个实现,但是没有给出范例,学习过程中发现网络上也找不到.le ...

  9. Swift实战-豆瓣电台(七)显示动画

    youku观看地址http://v.youku.com/v_show/id_XNzMxODQzNDIw.html 这是一个很酷的动画效果.特别是数据多的时候 知识点 在单元格(Cell)显示方法中设置 ...

  10. Lintcode: Binary Tree Serialization (Serialization and Deserialization Of Binary Tree)

    Design an algorithm and write code to serialize and deserialize a binary tree. Writing the tree to a ...