Win32 SDK利用ListView控件。
为了使用ListView控件,我们需要初始化公共控件库,我们需要在程序刚刚启动时调用
InitCommonControls() 函数,如果发生链接错误,说明我们没有链接拥有该函数的库文件。它们对应的
头和库 DLL分别为 #include <commctrl.h> comctl32.lib comctl32.dll
为了使用这个控件 我们就需要知道它的窗口类,利用Spy++等文件可以找到指定进程窗口的窗口类,
而一个ListView控件也是一个子窗口,所以我们可以得到它的类名为syslistview32,其他的控件,
我们只需要按照同样的道理来得到类名即可。
有了类名还不够,我们还需要知道每种控件的风格,比如listView控件有以下的风格LVS_REPORT | LVS_SHOWSELALWAYS, 它表示要产生报表和总是显示。为了得到控件的风格,我们可以通过MSDN中MFC中的ListView风格来作参考。有了窗口类和风格,我们利用CreateWindow就可以创建并得到
这个控件的句柄了。有了句柄,我们就可以随便控制了,具体要怎么看你自己的了。

此外为了向ListView内插入项和列,我们需要两个结构体。
LVITEM和LVCOLUMN

它们的定义分别为

typedef struct _LVITEM { UINT mask; int iItem; int iSubItem; UINT state; UINT stateMask; LPTSTR pszText; int cchTextMax; int iImage; LPARAM lParam;
#if (_WIN32_IE >= 0x0300)int iIndent;
#endif
#if (_WIN32_IE >= 0x560)int iGroupId;UINT cColumns; // tile view columnsPUINT puColumns;
#endiftypedef struct _LVCOLUMN { UINT mask; int fmt; int cx; LPTSTR pszText; int cchTextMax; int iSubItem;
#if (_WIN32_IE >= 0x0300)int iImage;int iOrder;
#endif
} LVCOLUMN, *LPLVCOLUMN; } LVITEM, *LPLVITEM;

有了这两个结构体,我们就可以利用SendMessage来给ListView控件发送消息来为它添加项和列。
我们分别通过下面两个消息来添加项和列。
SendMessage(hButton, LVM_INSERTITEM, 0, (LPARAM)&item);
SendMessage(hButton, LVM_INSERTCOLUMN, 0, (LPARAM)&colmn);

LVM_INSERTITEM表示添加项
LVM_INSERTCOLUMN表示添加列。
为了更好的查找关于ListView的消息,我们只需要在网上或MSDN 里查找 LVM_XXXXXX 就可以找到
相关的消息了。最好自己整理出一份关于ListView的全部消息。

WindowFrame &wndFrame = WindowFrame::Instance();
   
    GetWindowRect(hWnd, &rect);
    cx = rect.right-rect.left;
    cy = rect.bottom-rect.top;

switch(msg)
    {
    case WM_CREATE:
        {
            rowIndex = 7;
            hButton = CreateWindow("syslistview32", "",
                                     WS_VISIBLE|WS_CHILD|WS_BORDER|
                                    LVS_REPORT | LVS_SHOWSELALWAYS,
                                    10, 20,
                                    cx-30,
                                    cy-100,
                                    hWnd, NULL, wndFrame.getInstance(), NULL);
            // 添加数据
            LV_ITEM item;       // 项
            LV_COLUMN colmn;     // 列
            ZeroMemory(&item, sizeof(LV_ITEM));
            ZeroMemory(&colmn, sizeof(LV_COLUMN));
           
            colmn.mask = LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; // 风格
            colmn.cx = 0x28;
            colmn.pszText = "进程名"; // 文字
            colmn.cx = 0x42;         // 后面列
            SendMessage(hButton, LVM_INSERTCOLUMN, 0, (LPARAM)&colmn);
            colmn.pszText = "内存使用";
            SendMessage(hButton, LVM_INSERTCOLUMN, 0, (LPARAM)&colmn);
            colmn.pszText = "ID";
            SendMessage(hButton, LVM_INSERTCOLUMN, 0, (LPARAM)&colmn);

// 添加一些行项
            item.mask = LVIF_TEXT;       // 文字
            item.cchTextMax = MAX_PATH;       // 文字长度
            item.iItem = 0;
            item.iSubItem = 0;
            item.pszText = "中国";
            SendMessage(hButton, LVM_INSERTITEM, 0, (LPARAM)&item);
            item.pszText = "日本";
            SendMessage(hButton, LVM_INSERTITEM, 0, (LPARAM)&item);
            item.pszText = "德国";
            SendMessage(hButton, LVM_INSERTITEM, 0, (LPARAM)&item);
            item.pszText = "俄国";
            SendMessage(hButton, LVM_INSERTITEM, 0, (LPARAM)&item);
            item.pszText = "美国";
            SendMessage(hButton, LVM_INSERTITEM, 0, (LPARAM)&item);
            item.pszText = "英国";
            SendMessage(hButton, LVM_INSERTITEM, 0, (LPARAM)&item);
            item.pszText = "法国";
            SendMessage(hButton, LVM_INSERTITEM, 0, (LPARAM)&item);
        }
        break;

以下是源代码

#include <windows.h>
#include <stdio.h>
#include "stdlib.h"
#include "brd_Ihead.h"
#include <commctrl.h>

typedef struct _LVITEM
{
 UINT mask;    
 int iItem;    
 int iSubItem;    
 UINT state;    
 UINT stateMask;    
 LPTSTR pszText;    
 int cchTextMax;    
 int iImage;    
 LPARAM lParam;
#if (_WIN32_IE >= 0x0300)   
 int iIndent;
#endif
#if (_WIN32_IE >= 0x560)   
 int iGroupId;   
 UINT cColumns; // tile view columns   
 PUINT puColumns;
#endif
 typedef struct _LVCOLUMN
 {    
  UINT mask;    
  int fmt;    
  int cx;    
  LPTSTR pszText;    
  int cchTextMax;    
  int iSubItem;
#if (_WIN32_IE >= 0x0300)   
  int iImage;   
  int iOrder;
#endif
 } LVCOLUMN, *LPLVCOLUMN;
} LVITEM, *LPLVITEM;

// 全局主对象
CMainObj g_MainObj;

// Win32消息入口
LRESULT CALLBACK WinSunProc(HWND hwnd/*窗口句柄*/,UINT uMsg/*消息id*/,WPARAM wParam/*附加信息*/, LPARAM lParam/*附加信息*/);

// Win32程序入口
int WINAPI WinMain(HINSTANCE hInstance/*应用程序实例*/,HINSTANCE hPrevInstance,LPSTR lpCmdLine/*命令行参数*/,int nCmdShow/*显示模式*/)
{
 // 初始化全局窗口数据
 g_MainObj.Init();
 //定义窗口类
 WNDCLASS mainWint;
 mainWint.style   = g_MainObj.m_szWNDCLASS.style;
 mainWint.lpfnWndProc = WinSunProc;
 mainWint.cbClsExtra  = g_MainObj.m_szWNDCLASS.cbClsExtra;
 mainWint.cbWndExtra  = g_MainObj.m_szWNDCLASS.cbWndExtra;
 mainWint.hbrBackground = g_MainObj.m_szWNDCLASS.hbrBackground;
 mainWint.hCursor  = g_MainObj.m_szWNDCLASS.hCursor;
 mainWint.hIcon   = g_MainObj.m_szWNDCLASS.hIcon;
 mainWint.hInstance  = hInstance;
 mainWint.lpszClassName = g_MainObj.m_szWNDCLASS.lpszClassName;
 mainWint.lpszMenuName = g_MainObj.m_szWNDCLASS.lpszMenuName;
 //注册窗口类
 if (!RegisterClass(&mainWint))
 {
  MessageBox (NULL, TEXT ("This program requires Windows NT!"),MAIN_WIND_CLASSNAME, MB_ICONERROR) ;
  return PROC_SUCCESS;
 }
 // 创建主窗口
 HWND hWnd_t;
 hWnd_t = CreateWindow(MAIN_WIND_CLASSNAME,MAIN_WIND_NAME,MAIN_WIND_STYLE,\
  MAIN_WIND_X,MAIN_WIND_Y,MAIN_WIND_WIDTH,MAIN_WIND_HIGHT,NULL,NULL,hInstance,NULL);
 // 显示更新主窗口
 ShowWindow(hWnd_t,SW_SHOWNORMAL);
 UpdateWindow(hWnd_t);
 g_MainObj.m_hMainWnd = &hWnd_t;

/*
 BOOL GetMessage(
 LPMSG lpMsg,   //消息结构指针
 HWND hWnd, //从哪个窗口获得消息 NULL接受任何窗口的消息
 UINT wMsgFilterMin, //消息最小值 通常为0
 UINT wMsgFilterMax //消息最大值 2个都是0 表示接受所有消息
 );
 */
 MSG msg;
 //消息获取 循环函数
 while(GetMessage(&msg,NULL,0,0))
 {
  //解析消息
  TranslateMessage(&msg);
  //派发消息
  DispatchMessage(&msg);
 }

return PROC_SUCCESS;
}

// 消息分派
LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
 if(g_MainObj.MainFunctionInterface(hwnd,uMsg,wParam,lParam))
 {
  return DefWindowProc(hwnd,uMsg,wParam,lParam);
 }

return PROC_SUCCESS;
}

CIBase::CIBase(void) : m_hMainWnd(NULL),m_pMsgEx(new CMsgEx)
{
}
CIBase::~CIBase(void)
{
 delete m_pMsgEx;
}

CMainObj::CMainObj(void)
{
}
CMainObj::~CMainObj(void)
{

}
int CMainObj::Init(void)
{
 /*
  * 窗口样式初始化
  *
  */
 
 //类型窗口的样式 风格 水平重画和垂直重画
 m_szWNDCLASS.style   = MAIN_CLASS_STYLE ; 
 //窗口过程函数(回调函数)函数指针
 //m_szWNDCLASS.lpfnWndProc  = WinSunProc; 
 // 一般为0   附加内存空间
 m_szWNDCLASS.cbClsExtra  = MAIN_CLASS_CBCLSEXTRA; 
 // 一般为0   窗口附加内存
 m_szWNDCLASS.cbWndExtra  = MAIN_CLASS_CBWNDEXTRA; 
 //背景画刷句柄
 m_szWNDCLASS.hbrBackground  = MAIN_CLASS_BACKGROUND; 
 //光标句柄
 m_szWNDCLASS.hCursor  = MAIN_CLASS_CURSOR; 
 //窗口类的图标句柄
 m_szWNDCLASS.hIcon   = MAIN_CLASS_ICON; 
 //包含窗口过程的实例句柄
 //m_szWNDCLASS.hInstance = hInstance;
 //窗口类名
 m_szWNDCLASS.lpszClassName = MAIN_CLASS_NAME; 
 //菜单资源名
 m_szWNDCLASS.lpszMenuName = MAIN_CLASS_MENU ;

return PROC_SUCCESS;
}

int CMainObj::MainFunctionInterface(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
 m_pMsgEx->hwnd  = hwnd;
 m_pMsgEx->uMsg  = uMsg;
 m_pMsgEx->lParam = lParam;
 m_pMsgEx->wParam = wParam;

if(OnMsg(m_pMsgEx))
 {
  return PROC_FAILED;
 }

return PROC_SUCCESS;
}

int CMainObj::OnMsg(CMsgEx *pMsgEx)
{
 static HWND hwndList, hwndText, hwndList_s;
 int iIndex, iLength, cxChar, cyChar ;

switch(pMsgEx->uMsg)
 {
  //case WM_COMMAND:
  // switch(wParam) {
  // case :
  //   ;
  //   break;
  //
  // }
 case WM_KEYDOWN:
  switch(pMsgEx->wParam)
  {
  case VK_F1:
   cxChar = LOWORD (GetDialogBaseUnits ()) ;
   cyChar = HIWORD (GetDialogBaseUnits ()) ;
   hwndList = CreateWindow ("listbox", NULL,
    WS_CHILD | WS_VISIBLE | LBS_STANDARD,
    cxChar, cyChar * 9,
    cxChar * 16 + GetSystemMetrics (SM_CXVSCROLL),
    cyChar * 5,
    pMsgEx->hwnd, (HMENU) ID_LIST,
    (HINSTANCE) GetWindowLong (pMsgEx->hwnd, GWL_HINSTANCE),
    NULL);
   hwndText = CreateWindow ("edit", "goods!",
    WS_CHILD | WS_VISIBLE | SS_LEFT,
    0, cyChar, 
    500, cyChar*8,
    pMsgEx->hwnd, (HMENU) ID_TEXT,
    (HINSTANCE) GetWindowLong (pMsgEx->hwnd, GWL_HINSTANCE),
    NULL) ;
   
   ShowWindow(hwndList,SW_SHOWNORMAL);
   ShowWindow(hwndText,SW_SHOWNORMAL);
   MessageBox(pMsgEx->hwnd,"F1 pressed","F1 pressed",MB_OK);
   break;
  case VK_F2:
   hwndList_s = CreateWindow("syslistview32", "",
    WS_VISIBLE|WS_CHILD|WS_BORDER|
    LVS_REPORT | LVS_SHOWSELALWAYS,
    10, 20,
    300,
    300,
    pMsgEx->hwnd, NULL, (HINSTANCE) GetWindowLong (pMsgEx->hwnd, GWL_HINSTANCE), NULL);
   // 添加数据
   LV_ITEM item;       // 项
   LV_COLUMN colmn;     // 列
   ZeroMemory(&item, sizeof(LV_ITEM));
   ZeroMemory(&colmn, sizeof(LV_COLUMN));

colmn.mask = LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; // 风格
   colmn.cx = 0x28;
   colmn.pszText = "进程名"; // 文字
   colmn.cx = 0x42;         // 后面列
   SendMessage(hwndList_s, LVM_INSERTCOLUMN, 0, (LPARAM)&colmn);
   colmn.pszText = "内存使用";
   SendMessage(hwndList_s, LVM_INSERTCOLUMN, 0, (LPARAM)&colmn);
   colmn.pszText = "ID";
   SendMessage(hwndList_s, LVM_INSERTCOLUMN, 0, (LPARAM)&colmn);

// 添加一些行项
   item.mask = LVIF_TEXT;       // 文字
   item.cchTextMax = MAX_PATH;       // 文字长度
   item.iItem = 0;
   item.iSubItem = 0;
   item.pszText = "中国";
   SendMessage(hwndList_s, LVM_INSERTITEM, 0, (LPARAM)&item);
   item.pszText = "日本";
   SendMessage(hwndList_s, LVM_INSERTITEM, 0, (LPARAM)&item);
   item.pszText = "德国";
   SendMessage(hwndList_s, LVM_INSERTITEM, 0, (LPARAM)&item);
   item.pszText = "俄国";
   SendMessage(hwndList_s, LVM_INSERTITEM, 0, (LPARAM)&item);
   item.pszText = "美国";
   SendMessage(hwndList_s, LVM_INSERTITEM, 0, (LPARAM)&item);
   item.pszText = "英国";
   SendMessage(hwndList_s, LVM_INSERTITEM, 0, (LPARAM)&item);
   item.pszText = "法国";
   SendMessage(hwndList_s, LVM_INSERTITEM, 0, (LPARAM)&item);

MessageBox(pMsgEx->hwnd,"F2 pressed","F2 pressed",MB_OK);
   break;
   //在这里可以添加更多按键的处理过程
  case VK_ADD:
   MessageBox(pMsgEx->hwnd,"F2 pressed","F2 pressed",MB_OK);
   break;
  }
  break;
 case WM_CHAR: //接受按键消息
  SetTimer(pMsgEx->hwnd,1,1000,0);
  char szChar[20];
  sprintf(szChar,"char is %c",pMsgEx->wParam);
  MessageBox(pMsgEx->hwnd,szChar,"窗口标题",MB_YESNO);
  break;
 case WM_TIMER:
  //pp= (long*) malloc( sizeof(100));
  // MessageBox(hwnd,"鼠标右键","鼠标右键",MB_OK);
  //pp=fopen("C:/Documents and Settings/Administrator/桌面/zhy.txt","at+");

case WM_RBUTTONDOWN://接受鼠标右健消息

//MessageBox(hwnd,"鼠标右键","鼠标右键",MB_OK);
  //break;
 case WM_LBUTTONDOWN: //得到当鼠标左键按下时的鼠标位置
  /*x = LOWORD(lParam);
  y = HIWORD(lParam);
  char info[20];
  sprintf(info,"%d,%d",x,y);
  MessageBox(hwnd,info,"鼠标左键",MB_OK);*/
 case WM_PAINT://接受绘制消息
  HDC hDC;
  PAINTSTRUCT ps;
  hDC=BeginPaint(pMsgEx->hwnd,&ps);
  TextOut(hDC,100,100,"手好痛阿。。 !",strlen("手好通阿。。 !"));
  //LineTo(hDC,100,100);
  EndPaint(pMsgEx->hwnd,&ps);
  break;

case WM_CLOSE://接受关闭消息
  if(IDYES==MessageBox(pMsgEx->hwnd,"是否真的结束?","窗口标题",MB_YESNO))
  {
   DestroyWindow(pMsgEx->hwnd);
  }
  break;
 case WM_DESTROY://接受销毁窗口消息
  PostQuitMessage(0);
  break;

default:
  return PROC_FAILED;
 }

return PROC_SUCCESS;
}

简单win32程序创建控件相关推荐

  1. java控件数组_在C# WinForm程序中创建控件数组及相应的事件处理

    控件数组是VB提供的一个优秀的设计解决方案,它能很方便快捷的处理大批同类控件的响应和时间处理,但不知为什么在C#中这个优秀特性没有传承下来,甚为可惜,本文将要探讨就是如何在C# WinForm程序实现 ...

  2. C#线程间操作无效: 从不是创建控件 XX 的线程访问它

    转自:http://www.arasplm.net/index.php/zh/community/myblog/c-xx-.html 前些天做的要使用到线程的项目,现在和大家分享一下感受! 以下面小列 ...

  3. 黄聪:BackGroundWorker解决“线程间操作无效: 从不是创建控件的线程访问它” (C# VS2008)...

    在编程中经常会遇到在一个按钮中执行复杂操作,并将复杂操作最后返回的值加入一个ListView或ComboBox中候选.这个时候程序会卡,当程序员将这些卡代码放进线程(Thread)中后发现当对控件操作 ...

  4. 在.NET上如何根据字符串动态创建控件

    在.Net上用字符串动态创建控件是通过反射来实现. 首先,利用System.Type.GetType方法,获得字符串中指定的控件的类型实例. 这里需要注意这个字符串的语法,根据msdn的解释: 按名称 ...

  5. 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析...

    最近,在做一个使用线程控制下载文件的小程序(使用进度条控件显示下载进度)时,遇到这样的问题, 错误显示: 未处理的"System.InvalidOperationException" ...

  6. 安卓开发(一)环境搭建、基本程序与控件

    layout: post title: 安卓开发(一)环境搭建.基本程序与控件 description: 安卓开发(一)环境搭建.基本程序与控件 tag: 安卓 文章目录 Intent:协助应用间的交 ...

  7. 在 Visual Basic .NET 和 Visual C# .NET 中创建控件数组

    在 Visual Basic .NET 和 Visual C# .NET 中创建控件数组 摘要:本文介绍如何使用 Visual Basic® .NET 和 Visual C#™ .NET 创建和管理控 ...

  8. 11. Windows应用程序常用控件

    Windows应用程序常用控件 1 控件概述 1.1 控件的分类及作用 1.2 控件的命名规范 1.2 控件的相关操作 2.1 添加控件 2.2 对齐控件 2.3 锁定控件 2.4 删除控件 3 文本 ...

  9. 【第3版emWin教程】第49章 emWin6.x的AppWizard创建控件回调消息

    教程不断更新中:第3版emWin教程和ThreadX GUIX教程开工,双管齐下,GUIX更新至第28章,emWin更新至第50章(2021-10-01) - uCOS & uCGUI &am ...

最新文章

  1. fail2ban使用教程
  2. linux truss strace ltrace 对比 诊断调试程序
  3. 内存管理算法--Buddy伙伴算法
  4. python2中xrange比range优点_【Python面试】 说说Python中xrange和range的区别?
  5. 转同事博客一则,随感
  6. Python 16进制与字符串的转换、二进制 to 十进制、十六进制 to 十进制、十进制 to 二进制
  7. vector 使用 c++11 Lambda 表达式 排序
  8. Dell PowerEdge R740xd可以做什么?
  9. ArcGIS JavaScript API本地部署离线开发环境
  10. jmap 文件解析_jvm系列:dump文件深度分析
  11. android base64 字符串,Android 文件转base64字符串
  12. html5游戏怎么做apk,如何把h5app打包成移动apk
  13. win7计算机怎么录屏,win7电脑怎么录屏,什么电脑录屏软件好用?
  14. P5144 蜈蚣 (线性DP)
  15. 2020年下半年会议时间表
  16. VO、DTO、BO、QO、DO 如何使用,在那一层使用,一张图告诉你;别再纠结命名规则啦,我来告诉你
  17. ABAQUS|多重约束的解决办法!(过约束/螺栓预紧力)
  18. 学校运动会开幕式邀请函
  19. Java面试题基础系列228道(2),查漏补缺
  20. 动物克隆技术应用价值_浅谈生物克隆技术及其未来应用问题与前景

热门文章

  1. 5分钟带你走进webpack
  2. 决策树c5.0算法r语言实现,R C5.0决策树实例转摘
  3. 剑魂之刃服务器维护,剑魂之刃全服合服停机维护预告
  4. splash启动速度优化
  5. 珍惜在天堂和地狱溜达的每一天
  6. 植物大战僵尸英文原版
  7. 中国劳动关系学院计算机专业分数,中国劳动关系学院是几本?录取分数线是多少?...
  8. 重庆二本计算机大学及分数线,2018年重庆二本大学排名及分数线
  9. 从0糖到0防腐剂,元气森林缘何偏向“虎山行”?
  10. 网络游戏服务器修改时间,如何修改游戏服务器时间