Win32封装对话框类
[主程序入口.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封装对话框类的更多相关文章
- CFileDialog(文件夹对话框类)和CFontDialog(字体设置对话框类)的使用学习
CFileDialog(文件夹对话框类) 主要用于文件的保存,另存,打开,关闭等功能 功能“另存为”的实现: void CTXTDlg::OnFileSaveas() { LPCTSTR szFilt ...
- 一个简单的基于 DirectShow 的播放器 2(对话框类)
上篇文章分析了一个封装DirectShow各种接口的封装类(CDXGraph):一个简单的基于 DirectShow 的播放器 1(封装类) 本文继续上篇文章,分析一下调用这个封装类(CDXGrap ...
- 适用于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通用)>,现在重新整理一 ...
- SpringMVC 自动封装枚举类的方法
springmvc默认无法自动封装枚举类,解决方法如下: 1.枚举类 public enum GoodsPromoteEnum { /** * 0 精品 */ fine("精品", ...
- MFC编程入门之八(对话框:创建对话框类和添加控件变量)
创建好对话框资源后要做的就是生成对话框类了.生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数. 例程Addition是基于对话框的程序,所以程序自动创建了对话框模板IDD_ADDIT ...
- mfc 在VC的两个对话框类中传递参数的三种方法
弄了好久,今天终于把在VC中的对话框类之间传递参数的问题解决了,很开心,记录如下: 1. 我所建立的工程是一个基于MFC对话框的应用程序,一共有三个对话框,第一个对话框为主对话框,所对应的类为CTMD ...
- MFC中对话框类(Dialog)的应用
转载http://hi.baidu.com/jackywdx/item/feee8041d2c2e12310ee1e85 Windows应用程序通常是通过对话框接收用户输入.向用户输出信息,本节介绍应 ...
- iOS NSURLSession 封装下载类
周六日鼓捣NSURLSession,效率虽然低下,最后还是有了一点点眉目.昨天和汤老师一起测试,又对它加深了一点理解.趁热打铁,先总结一下. 封装的类,对外用的方法,我写的是类方法,所以,在类方法中, ...
- 封装application类
<?php //判断用户是否是通过入口文件访问 if(!defined('ACCESS')){ echo '非法请求'; die; } //封装初始化类 cla ...
- 封装mysql类
类: <?phpheader("content-type:text/html;charset=utf-8");//封装一个类/*掌握满足单例模式的必要条件(1)私有的构造方法 ...
随机推荐
- JSP四个作用域和九个对象
一.四个作用域 (1)Requset 请求作用域,就是客户端的一次请求 (2)Session 会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记住这个会话状态.生命周期:会话超时,或者 ...
- 在C#中使用RabbitMQ做个简单的发送邮件小项目
在C#中使用RabbitMQ做个简单的发送邮件小项目 前言 好久没有做项目了,这次做一个发送邮件的小项目.发邮件是一个比较耗时的操作,之前在我的个人博客里面回复评论和友链申请是会通过发送邮件来通知对方 ...
- 全志科技T3国产工业核心板规格书(四核ARM Cortex-A7,主频1.2GHz)
1 核心板简介 创龙科技SOM-TLT3是一款基于全志科技T3处理器设计的4核ARM Cortex-A7国产工业核心板,每核主频高达1.2GHz. 核心板通过邮票孔连接方式引出CSI.TVIN.MIP ...
- Power BI实用技巧:轻松打造专业级甘特图
Power BI实用技巧:轻松打造专业级甘特图 大家好,今天我们要一起探索Power BI中一个既实用又强大的功能--制作甘特图.甘特图以其直观展示项目时间线和任务进度的特点,在项目管理中扮演着重要角 ...
- Spring注解之构建器@Builder的用法
简述 Builder使用创建者模式又叫建造者模式.简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程. 基础使用 @Builder 注解为你的类生成相对略 ...
- 深耕分析型数据库领域,火山引擎ByteHouse入围《2024爱分析数据库厂商全景报告》
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群. 近日,爱分析发布<2024爱分析·数据库厂商全景报告>,报告中爱分析将数据市场从上至下划分为数据库服 ...
- [oeasy]python0021_python虚拟机的位置_可执行文件_转化为字节形态
程序本质 回忆上次内容 \n 就是换行 他对应着 ascii 字符的代码是(10)10进制 他的英文是 LF,意思是Line Feed 我们可以在<安徒 ...
- Top monitor[2.1.11] 开源
说明 本项目将转为开源项目. \(\text{GitHub}\) 仓库下载链接 \(|\) 项目初始化下载 \(|\) 项目编辑文件下载. 项目说明 声明:此项目由 \(\text{So_noSlac ...
- Vue3中如何使用this
vue3提供了getCurrentInstance ,通过这个属性,直接使用ctx是错误的,需要找到全局属性globalProperties import { getCurrentInstance } ...
- 后端说,单页面SPA和前端路由是怎么回事
没有请求的路由 在传统开发中,浏览器点击一个超链接,就会像后端web服务器发送一个html文档请求,然后页面刷新.但开始单页面开发后,就完全不同了. 单页面?这个概念难以理解.我用一个js作为整个we ...