对话框程序基础控件的使用

                                                                  
​1. 创建一个对话框程序1 - 创建步骤
在项目的资源区创建一个对话框
删除掉VS2012自动生成的创建窗口代码
添加我们的创建窗口代码:
// 创建非模态对话框
HWND hWnd =  (HWND)CreateDialog(hInstance, LPTSTR(IDD_DIALOG1), 0, (DLGPROC)WndProc);  

​1. 创建一个对话框程序2 - 注意事项
不再需要注册窗口类,消息回调函数的未处理消息不用再传递给DefWindowProc,而是直接返回FALSE,如果所有消息都已经处理,直接返回TRUE

备注: 可以使用类似于以下代码为窗口设置菜单
g_hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDC_WIN32));  

switch (message)
case WM_INITDIALOG:
{
   SetMenu(hWnd, g_hMenu);
}
break;


​1.多选框 (Check Box)控件
HWND hChekcBox = GetDlgItem(主窗口句柄, 资源ID)

设置为选中状态
SendMessage(hCheckBox, BM_SETCHECK, BS_3STATE, 0);

取消其选中状态
SendMessage(hCheckBox, BM_SETCHECK, 0, 0);

获取其选中状态
BOOL bIsCheck = SendMessage(hCheckBox, BM_GETCHECK, 0, 0);

3. 进度条 (ProgressControl) 控件
HWND hPosControl = GetDlgItem(主窗口句柄, 资源ID)
设置进度(注: 数值必须为0~100之间)
SendMessage(hPosControl, PBM_SETPOS, 数值, 0);
获取进度
int nPos = SendMessage(hPosControl, PBM_GETPOS, 0, 0);

4. 滑块(SliderControl) 控件
HWND hSliderControl = GetDlgItem(主窗口句柄,资源ID)
设置滑块范围值
SendMessage(hSliderControl, TBM_SETRANGE, true, MAKELONG(最小值, 最大值));
设置滑块值
SendMessage(hSiderControl, TBM_SETPOS, true, 值);
获取滑块值
int nPos = SendMessage(hSliderControl, TBM_GETPOS, 0, 0);

5. 下拉框(ComboBox)控件
点小黑箭头,可以拉高整个窗口
可以用宏代替SendMessage
#include <Windowsx.h>
HWND hComBox = GetDlgItem(/*主窗口句柄*/,  /*资源ID*/);
添加选项
ComboBox_AddString(hComBox, L"选项名");
设置选项
ComboBox_SelectString(hComBox, -1, L"选项名");
获取选项序号
int nCurSel = ComboBox_GetCurSel(hComBox);
获取选项内容
WCHAR szText[64] = {0};
ComboBox_GetText(hWnd, szText, 64);

6. 图片(PictureControl) 控件
首先需要编辑控件类型为"Bitmap"
HWND    hPicCtr  = GetDlgItem(hWnd, PIC);
HBITMAP hBitMap  = LoadBitmap(GetModuleHandle(0), MAKEINTRESOURCE(IDB_BITMAP1));  

加载并显示位图
SendMessage(hPicCtr, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitMap);  

加载并显示图标
HDC   hdc   = GetDC(hWnd);
HICON hIcon = LoadIcon(GetModuleHandle(0), MAKEINTRESOURCE(IDI_ICON1));
DrawIcon(hdc, 75, 306, hIcon);
ReleaseDC(hWnd, hdc);  

7. 可以正常接收按键消息的窗口
需要使用CreateDialog函数创建窗口
HWND hWnd = (HWND)CreateDialog(hInstance,LPTSTR(IDD_DIALOG1),0,(DLGPROC)WndProc);

修改消息循环机制
// 主消息循环
while (GetMessage(&msg, NULL, NULL, NULL))
{
    if (WM_KEYDOWN == msg.message)
    {
        SendMessage(hWnd, WM_KEYDOWN, msg.wParam, msg.lParam);
    }
    else
    {
        // 不是非模式对话框的消息才分发
        if (!IsDialogMessage(hWnd, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
         }
     }
}  

在WM_KEYDOWN下添加以下代码
#include <Strsafe.h>
#include <mmsystem.h>
#prama comment(lib, "WINMM.LIB")
WCHAR szFullPath[MAX_PATH];
StringCbPrintf(szFullPath, MAX_PATH, L"Sound\\Sound_%C.wav", wParam);
sndPlaySound(szFullPath, SND_ASYNC);

8. 列表(List View)控件A -- 创建流程
在窗口中添加一个列表控件往往分为以下几步:
1. 在相应对话框上添加List Control控件
2. 初始化List Control控件的状态及内容(View属性改为Report才有效)
3. 调整List Control控件样式,以使符号要求
4. 添加剩余功能

关键函数:
ListView_InsertColumu();

8. 列表(List View)控件B-- 初始化
LVCOLUMN lvc = {0};                    // 定义结构体
lvc.mask     = LVCF_WIDTH|LVCF_TEXT;   // 列表框样式
lvc.cx       = 90 ;                    // 列的宽度
lvc.iImage   = 1;                      // 与列表框关联的指定图像的索引值
lvc.fmt      = LVCFMT_LEFT;            // 列的对齐方式
lvc.pszText  = L"name";                // 列名
lvc.iSubItem = 0;                      // 列序号
ListView_InsertColumn(GetDlgItem(hWnd,IDC_LIST1), lvc.iSubItem, &lvc);
lvc.pszText  = L"type";
lvc.cx       = 50 ;  
lvc.iSubItem = 1;
ListView_InsertColumn(GetDlgItem(hWnd,IDC_LIST1), lvc.iSubItem, &lvc);
lvc.pszText  = L"size";
lvc.cx       = 50 ;  
lvc.iSubItem = 2;
ListView_InsertColumn(GetDlgItem(hWnd,IDC_LIST1), lvc.iSubItem, &lvc);  


8. 列表(List View)控件C-- 添加项
用以下代码插入一项(行), 并设置某一子项(列)的值
LVITEM lvItem    = {0};
lvItem.mask      = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM|LVIF_STATE;
lvItem.state     = 0;                  // 子项的状态
lvItem.stateMask = 0;                  // 状态有效的屏蔽位
lvItem.iImage    = 0;                  // 与列表框关联的指定图像的索引值
lvItem.iSubItem  = 0;                  // 子项的索引值(可以视为列号)
lvItem.iItem     = 0;                  // 项的索引值(可以视为行号)
lvItem.pszText   = L"name1";           // 该项的某子项的值 
lvItem.cchTextMax = wcslen(lvItem.pszText)+sizeof(TCHAR);
ListView_InsertItem(GetDlgItem(hWnd, IDC_LIST1), &lvItem);
ListView_SetItemText(GetDlgItem(hWnd, IDC_LIST1), lvItem.iItem, 2, L"a");  

8. 列表(List View)控件D-- 右键菜单
编辑完菜单资源后,在WM_NOTIFY消息下添加如下代码:
// 1. 判断是否为右键单击消息,不是的话直接返回
if ( NM_RCLICK != ((LPNMHDR)lParam)->code )
{
    break;
}
// 2. 初始化必要的信息
POINT stcPoint = {0};                           // 发生次消息时的鼠标坐标
HWND  hList    = GetDlgItem(hWnd, IDC_LIST1);   // 列表框的HWND
GetCursorPos(&stcPoint);
// 3. 将鼠标位置转化为相对坐标,然后测试是否选中的列表框中的某一项
int        nItemIndex;
TVHITTESTINFO thti;
ScreenToClient(hList, &stcPoint);
thti.pt    =  stcPoint;
thti.flags = LVHT_EX_GROUP_HEADER;
nItemIndex = ListView_HitTestEx(hList, &thti);
// 4. 如果选取了,则弹出菜单
if (-1 != nItemIndex)
{
// 4.1 加载菜单资源
HMENU hMenu  = LoadMenu(NULL, MAKEINTRESOURCE(IDR_MENU1));
HMENU hPopup = GetSubMenu(hMenu, 0);
if (!hMenu||!hPopup)
{
    break;
}
// 4.2 将相对坐标转换为原鼠标位置
ClientToScreen(hList, &stcPoint);
// 4.3 弹出菜单
TrackPopupMenuEx(hPopup, TPM_LEFTALIGN|TPM_RIGHTBUTTON, stcPoint.x, 
stcPoint.y, hWnd, NULL);
// 4.4 释放相关资源
DestroyMenu(hMenu);


9. 树(Tree View)控件A -- 插入函数
/***************************************************************************************
* 参数一: 树形控件句柄
* 参数二: 插入项名
* 参数三: 欲插入项的父项句柄
* 参数四: 欲插入项是否为文件夹
* 功  能: 插入一项到鼠标选中树形控件某处
****************************************************************************************/
HTREEITEM AddItemToTree( HWND hTree,LPWSTR lpItemName,HTREEITEM hParent, BOOL bFolder)
{
    TVITEM         tvi   = {0};             // 树节点项属性信息
    TVINSERTSTRUCT tvins = {0};             // 树形控件的节点信息
    tvi.mask             = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM;
    tvi.pszText          = lpItemName;
    tvi.cchTextMax       = wcslen(lpItemName)+sizeof(TCHAR);
    if ( bFolder )
    {
        tvi.iImage = 1; tvi.iSelectedImage = 2;
        tvi.cChildren = I_CHILDRENCALLBACK;
    } 
    else 
    {
        tvi.iImage = 3; tvi.iSelectedImage = 3;
        tvi.cChildren = 0;
    }
    tvins.item         = tvi;               // 插入点的属性信息
    tvins.hInsertAfter = TVI_SORT;          // 插入位置
    if ( NULL == hParent )                  // 父节点的句柄
        tvins.hParent = TVI_ROOT; 
    else
        tvins.hParent = hParent;
    return TreeView_InsertItem(hTree,&tvins);
}  


9. 树(Tree View)控件B -- 初始化
HWND       hTreeCtrl  =  GetDlgItem(hWnd, IDC_TREE1);
// 返回数形控件中选中项的句柄,父节点为空
HTREEITEM  hItem      =  TreeView_GetSelection(hTreeCtrl);
if ( hItem )
     AddItemToTree(hTreeCtrl, L"15PB", hItem, FALSE);
else
     AddItemToTree(hTreeCtrl, L"15PB", NULL, FALSE);  


9. 树(Tree View)控件C -- 获取项内容
a.  获取选择项
HWND      hTreeCtrl  =  GetDlgItem(hWnd,IDC_TREE1);
HTREEITEM hItem      =  TreeView_GetSelection(hTreeCtrl);  

b. 获取项内容
WCHAR     szMame[32] =  {0};
TVITEM    stcItem    =  {0};
stcItem.hItem        =  hItem;
stcItem.cchTextMax   =  32;
stcItem.pszText      =  szMame;
stcItem.mask         =  TVIF_TEXT|TVIF_HANDLE;
TreeView_GetItem( hTreeCtrl, &stcItem );  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值