[主程序入口.cpp]

#include <windows.h>
#include <tchar.h>
#include "resource.h"
#include "CMyApp.h" //这个还没用到,就先注释起来
//HINSTANCE m_hInstance;
HWND m_hWnd;
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
CMyApp* mApp = new CMyApp;
m_hWnd=mApp->ShowDialog(); return 0;
} //对话框父类的声明.h
[CWinDialog.h]
#pragma once
#include <windows.h>
#include <tchar.h> class CWinDialog
{
public:
CWinDialog(DWORD _IDD);
~CWinDialog(); public:
HWND ShowDialog();
static INT_PTR CALLBACK WinDlgPrce(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK MYWinDlgPrce(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
protected:
DWORD IDD;
HINSTANCE m_hInstance;
HWND m_hWnd;
protected:
//写的是虚函数,在子类去实例化
//要用的消息就在这理写个虚函数,在子类中实例化,
//相当于消息映射.
virtual BOOL OnInitDlg(); //初始化对话框
virtual BOOL OnRClick(WPARAM wParam, LPARAM lParam); // 右键弹出菜单
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam); // 右键菜单命令消息
private: }; // 对话框父类的实现.cpp
[CWinDialog.cpp]
#include "CWinDialog.h" CWinDialog* TheApp;
CWinDialog::CWinDialog(DWORD _IDD)
{
IDD = _IDD;
m_hWnd = NULL;
m_hInstance = ::GetModuleHandleW(NULL);//获得程序的实例句柄
TheApp = this;
} CWinDialog::~CWinDialog()
{
delete TheApp;
delete m_hInstance;
delete m_hWnd; } //创建和显示对话框
HWND CWinDialog::ShowDialog()
{
HWND hWnd=::CreateDialog(m_hInstance, (LPCTSTR)IDD, NULL, WinDlgPrce);
if (!IsWindow(hWnd))
return 0;
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd); MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return m_hWnd;
} INT_PTR CALLBACK CWinDialog::WinDlgPrce(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
TheApp->MYWinDlgPrce(hWnd, uMsg, wParam, lParam);
return 0; // 最开始是用下面这个直接返回,但是在子类继承时用MessageBox弹出对话框,不响应消息.
//return TheApp->MYWinDlgPrce(hWnd, uMsg, wParam, lParam);
} //前几天看了个视频,就是讲这个回调函数静态如何调成员函数
//就是用这种另外写一个成员的回调函数,所有的消息函数都写在这里面
//原来的回调函数只相当于傀儡.
INT_PTR CALLBACK CWinDialog::MYWinDlgPrce(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
m_hWnd = hWnd; switch (uMsg)
{ case WM_COMMAND:
OnCommand(wParam, lParam);
return 1; case WM_INITDIALOG:
{
OnInitDlg();
return 1;
}
case WM_CLOSE:
DestroyWindow(hWnd);
return 0; case WM_DESTROY:
PostQuitMessage(0);
return 0; case WM_CONTEXTMENU:
OnRClick(wParam,lParam);
return 1; }
return DefWindowProc(hWnd, uMsg, wParam, lParam);
} BOOL CWinDialog::OnInitDlg()
{
return TRUE;
} BOOL CWinDialog::OnRClick(WPARAM wParam, LPARAM lParam)
{
return TRUE;
} BOOL CWinDialog::OnCommand(WPARAM wParam, LPARAM lParam)
{
return TRUE;
} //子类的声明文件.h
[CMyApp.h]
#pragma once
#include "CWinDialog.h"
#include "resource.h" class CMyApp :
public CWinDialog
{
public:
CMyApp();
~CMyApp();
protected:
HWND hList;
private:
     int InsertColumn(HWND hList, UINT nCol, LPCTSTR ColName, WORD ColFmtDaty,UINT ColWith);
int InsertItem(HWND hList, int nItem, LPCTSTR lpszText);
BOOL SetItemText(HWND hList, int nItem, int nSubItem, LPCTSTR lpszText);
public:
    //下面是对父类虚函数实例化
BOOL OnInitDlg();
//BOOL OnNotify(WPARAM wParam, LPARAM lParam);
BOOL OnRClick(WPARAM wParam, LPARAM lParam);
BOOL OnCommand(WPARAM wParam, LPARAM lParam);
}; //子类的实现
[CMyApp.cpp]
#include "CMyApp.h"
#include <commctrl.h>
//#include <minwindef.h> CMyApp::CMyApp() :CWinDialog::CWinDialog(IDD_DIALOG1)
{
hList = NULL;
} CMyApp::~CMyApp()
{
} BOOL CMyApp::OnInitDlg()
{
hList = ::GetDlgItem(m_hWnd, IDC_LIST1);
SendMessage(hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
RECT rt;
::GetClientRect(hList, &rt);
int nListColWith = rt.right - 20; //设置列标题
InsertColumn(hList, 0, L"ID", LVCFMT_LEFT, (int)(0.2*nListColWith));
InsertColumn(hList, 1, L"Name", LVCFMT_LEFT, (int)(0.2*nListColWith));
InsertColumn(hList, 2, L"Sex", LVCFMT_LEFT, (int)(0.1*nListColWith));
InsertColumn(hList, 3, L"Age", LVCFMT_LEFT, (int)(0.1*nListColWith));
InsertColumn(hList, 4, L"Tel", LVCFMT_LEFT, (int)(0.4*nListColWith)); //插入项数据
InsertItem(hList, 0, L"001");
SetItemText(hList, 0, 1, L"赵红梅");
SetItemText(hList, 0, 2, L"女");
SetItemText(hList, 0, 3, L"40");
SetItemText(hList, 0, 4, L"132001"); InsertItem(hList, 1, L"002");
SetItemText(hList, 1, 1, L"叶伟");
SetItemText(hList, 1, 2, L"男");
SetItemText(hList, 1, 3, L"40");
SetItemText(hList, 1, 4, L"132002"); return TRUE;
} int CMyApp::InsertColumn(HWND hList, UINT nCol, LPCTSTR ColName, WORD ColFmtDaty, UINT ColWith)
{
LVCOLUMN col = { 0 };
col.cchTextMax = 256;
col.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
col.fmt = LVCFMT_LEFT;
col.cx = ColWith;
col.pszText =(LPTSTR) ColName;
col.iSubItem = nCol;
return (int)SendMessage(hList, LVM_INSERTCOLUMN, nCol, (LPARAM)&col);
} int CMyApp::InsertItem(HWND hList, int nItem, LPCTSTR lpszText)
{
LVITEM item = { 0 };
item.mask = LVCF_TEXT | LVCF_FMT;
item.iItem = nItem;
item.iSubItem = 0;
item.pszText = (LPTSTR)lpszText; return(int)SendMessage(hList, LVM_INSERTITEM, 0, (LPARAM)&item);
} BOOL CMyApp::SetItemText(HWND hList, int nItem, int nSubItem, LPCTSTR lpszText)
{
LVITEM lvi = { 0 };
lvi.iSubItem = nSubItem;
lvi.pszText = (LPTSTR)lpszText;
return (BOOL)SendMessage(hList, LVM_SETITEMTEXT, nItem, (LPARAM)&lvi);
} BOOL CMyApp::OnRClick(WPARAM wParam, LPARAM lParam)
{
if ((HWND)wParam == hList)
{
HMENU hMenu = LoadMenu(m_hInstance, LPCWSTR(IDR_MENU1));
HMENU hSubMenu = GetSubMenu(hMenu, 0);
POINT pt;
pt.y = HIWORD(lParam);
pt.x = LOWORD(lParam); TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_TOPALIGN,
pt.x, pt.y,0, m_hWnd, NULL); DestroyMenu(hMenu);
}
return TRUE;
} BOOL CMyApp::OnCommand(WPARAM wParam, LPARAM lParam)
{ switch (LOWORD(wParam))
{ case ID_POPUMENU_ADD:  //菜单添加消息
{
MessageBox(m_hWnd, L"添加", L"菜单项提示", MB_OK);
return 1;
}
case I_POPUMENU_DEL:  //菜单删除消息
      break:

//....其他菜单命令消息

} return 0;
}

  

Win32封装对话框类的更多相关文章

  1. CFileDialog(文件夹对话框类)和CFontDialog(字体设置对话框类)的使用学习

    CFileDialog(文件夹对话框类) 主要用于文件的保存,另存,打开,关闭等功能 功能“另存为”的实现: void CTXTDlg::OnFileSaveas() { LPCTSTR szFilt ...

  2. 一个简单的基于 DirectShow 的播放器 2(对话框类)

    上篇文章分析了一个封装DirectShow各种接口的封装类(CDXGraph):一个简单的基于 DirectShow 的播放器  1(封装类) 本文继续上篇文章,分析一下调用这个封装类(CDXGrap ...

  3. 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式

    适用于app.config与web.config的ConfigUtil读写工具类   之前文章:<两种读写配置文件的方案(app.config与web.config通用)>,现在重新整理一 ...

  4. SpringMVC 自动封装枚举类的方法

    springmvc默认无法自动封装枚举类,解决方法如下: 1.枚举类 public enum GoodsPromoteEnum { /** * 0 精品 */ fine("精品", ...

  5. MFC编程入门之八(对话框:创建对话框类和添加控件变量)

    创建好对话框资源后要做的就是生成对话框类了.生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数. 例程Addition是基于对话框的程序,所以程序自动创建了对话框模板IDD_ADDIT ...

  6. mfc 在VC的两个对话框类中传递参数的三种方法

    弄了好久,今天终于把在VC中的对话框类之间传递参数的问题解决了,很开心,记录如下: 1. 我所建立的工程是一个基于MFC对话框的应用程序,一共有三个对话框,第一个对话框为主对话框,所对应的类为CTMD ...

  7. MFC中对话框类(Dialog)的应用

    转载http://hi.baidu.com/jackywdx/item/feee8041d2c2e12310ee1e85 Windows应用程序通常是通过对话框接收用户输入.向用户输出信息,本节介绍应 ...

  8. iOS NSURLSession 封装下载类

    周六日鼓捣NSURLSession,效率虽然低下,最后还是有了一点点眉目.昨天和汤老师一起测试,又对它加深了一点理解.趁热打铁,先总结一下. 封装的类,对外用的方法,我写的是类方法,所以,在类方法中, ...

  9. 封装application类

    <?php  //判断用户是否是通过入口文件访问   if(!defined('ACCESS')){     echo '非法请求';     die;   }   //封装初始化类   cla ...

  10. 封装mysql类

    类: <?phpheader("content-type:text/html;charset=utf-8");//封装一个类/*掌握满足单例模式的必要条件(1)私有的构造方法 ...

随机推荐

  1. NAT类型发现

    一.前言 之前一篇文章中,提出了一个判断NAT类型的方案.该方案是自己研究设计的,比较粗糙.近期研读了关于STUN的一些协议标准,其中RFC3489中就包含了判断NAT类型的标准方案. 与自己设计的方 ...

  2. 【论文阅读】IROS2022: Dynamics-Aware Spatiotemporal Occupancy Prediction in Urban Environments

    0.参考与前言 完整题目: Dynamics-Aware Spatiotemporal Occupancy Prediction in Urban Environments 论文链接:https:// ...

  3. 统信 UOS 重置Root账号密码 获取 Root 权限

    统信服务器默认无法用root 账号登入系统,用普通管理员登入后在切换至root账户下即可,初次使用系统时 切换至root账户前需要做很多配置 1.同信切换root账户首先要激活下系统,可以选择试用期激 ...

  4. git使用教程及常用命令

    1.初次本地git连接远程仓库,并提交代码到远程仓库 第一步 码云上创建仓库 第二步 在需要上传的项目处右键-->git bush here 第三步  初始化本地git库 git init 设定 ...

  5. Solo 开发者周刊 (第10期):Sora 之后,谁是被遗忘的?谁又是被仰望的?

    这里会整合 Solo 社区每周推广内容.产品模块或活动投稿,每周五发布.在这期周刊中,我们将深入探讨开源软件产品的开发旅程,分享来自一线独立开发者的经验和见解.本杂志开源,欢迎投稿. 好文推荐 Sol ...

  6. openStack核心组件的工作流程

    目录 openStack核心组件的工作流程 1. Keystone 1.1 User 1.2 Credentials 1.3 Authentication 1.4 Token 1.5 Project ...

  7. 算法题练习,Solo和koko分糖 ,整数拆分, Cookies 分饼干

    目录 1. Candy Solo和koko分糖 2. 整数拆分 3=1+1+1 3=1+2 3=3 3. Cookies 分饼干 1. Candy Solo和koko分糖 如果可以分给弟弟,必定满足全 ...

  8. Linux 手工释放Linux Cache Memory

    手工释放Linux Cache Memory 为了加速操作和减少磁盘I/O,内核通常会尽可能多地缓存内存,这部分内存就是Cache Memory(缓存内存).根据设计,包含缓存数据的页面可以按需重新用 ...

  9. OpenGL 三角形颜色插值

    1.最懒的方法--Nearest Neighbor对于三角形内的点,离三个顶点谁最近,就赋值为那个顶点对应的颜色. 2.最天真的方法--Distance三角形内一点的值应该来自于三个顶点. 计算距离: ...

  10. 使用git(ee的一个小总结

    我先把后端项目推进了gitee,后面为了方便又想把前端也放在同一个项目里,结果出问题了: 一开始是因为前端项目内包含了.git的文件(这个玩意还是隐藏文件,就是你在idea里其实是看不到他的),导致只 ...