VC++(UI设计篇)
通过简单明朗的知识介绍,让读者能够快速学习VC++,掌握VC++基础知识,体会学习的乐趣。
老狼主
工作中展现自我,学习中完善自我,生活中乐活自我!
展开
-
VC++ 自定义弹出式菜单
CPoint point; ::GetCursorPos(&point);CMenu menu; menu.CreatePopupMenu();menu.AppendMenu(MF_STRING, 100, _T("菜单1"));menu.AppendMenu(MF_SEPARATOR);menu.AppendMenu(MF_STRING, 101, _T("菜单2"))...原创 2020-01-02 22:09:03 · 499 阅读 · 0 评论 -
VC++ CComboBox自绘(选择下拉列表框)
效果图:头文件定义(CSWCheckComboBox.h):#pragma onceclass CSWCheckComboBox : public CComboBox{ DECLARE_DYNAMIC(CSWCheckComboBox) // 成员私有结构定义 // 构造/析构函数public: CSWCheckComboBox(); virtual ~CSWCh...原创 2020-01-12 12:36:36 · 1790 阅读 · 1 评论 -
VC++ CDialog自绘(改进版)
考虑到设置最小化、最大化/恢复、关闭按钮比较麻烦,所以新增加自绘最小化、最大化/关闭、关闭按钮。核心代码如下:void CSWDialog::DrawSysMenu(Gdiplus::Graphics& g){ CRect rcClient; GetClientRect(rcClient); g.SetSmoothingMode(Gdiplus::/*SmoothingMode...原创 2020-01-11 00:08:45 · 554 阅读 · 0 评论 -
WTL 界面设计篇(CSkinHyperLink)
头文件声明(CSkinHyperLink.h):#pragma once#include "SkinManager.h"class CSkinHyperLink : public CWindowImpl<CSkinHyperLink, CStatic>{public: CSkinHyperLink(void); ~CSkinHyperLink(void); BEGIN_MSG_MAP_EX(CSkinHyperLink) MSG_WM_CREATE(OnCreate原创 2020-09-29 11:55:05 · 1086 阅读 · 0 评论 -
VC++ 图标集显示控件
1、效果图:2、素材准备:3、头文件声明:#pragma once#include <afxwin.h>class TIconCtrl : public CWnd{public: CSize m_szIcon; // 图标大小 int m_nMargin; // 图标在显示框中内测边距 int m_nColumn; // 每列显示图标个数 int m_nSelIndex; // 所选择的图标序号private: CToolTipCtrl m_原创 2021-01-07 13:26:03 · 785 阅读 · 1 评论 -
VC++ ComboBox右侧下拉列表三角形绘制
CRect rcClient; GetClientRect(&rcClient); CDC* pDC = GetDC(); CRect rcButton = rcClient; rcButton.left = rcButton.right - 16; if (rcButton.left < rcClient.left) rcButto...原创 2020-01-16 16:14:30 · 515 阅读 · 0 评论 -
WTL 界面设计篇(CSkinMenu)
头文件声明(CSkinMenu.h):#pragma once#include "SkinManager.h"#define SKIN_MENU_MAGIC 0x2010 // 皮肤菜单项目信息标识struct SKIN_MENU_ITEM_INFO // 皮肤菜单项目信息结构{ UINT nMagic; // 皮肤菜单项目信息标识 UINT nID; // 菜单ID UINT nState; // 菜单状态 UINT nType原创 2020-09-29 12:03:24 · 908 阅读 · 0 评论 -
VC++ Gdiplus::Bitmap抠图
void SetBackgroundMaskImage(LPCTSTR lpszImageName){ COLORREF crAlpha = RGB(255, 0, 0); Gdiplus::Bitmap* pBkgrMaskBitmap = CImageFactory::getSingletonPtr()->GetSkinItemImage(lpszImageName); st...原创 2020-01-06 18:11:33 · 1673 阅读 · 0 评论 -
WTL 界面设计篇(CSkinComboBox)
头文件声明(CSkinComboBox.h):#pragma once#include "SkinManager.h"#define WM_CBO_EDIT_MOUSE_HOVER WM_USER + 1#define WM_CBO_EDIT_MOUSE_LEAVE WM_USER + 2#define WM_CBO_LIST_HIDE WM_USER + 3class CSkinComboBoxEdit : public CWindowImpl<CSkinComb原创 2020-11-30 18:38:34 · 513 阅读 · 0 评论 -
VC++ CMemDC类的扩展(新版)
上一版本链接:https://blog.csdn.net/u012156872/article/details/103755254,测试过程中发现存在问题,于是进行了功能补充。源码实现(CSWMemDC.h):#pragma oncenamespace sw { class CMemDC : public CDC { public: CMemDC(CDC& dc, ...原创 2020-03-19 14:08:01 · 379 阅读 · 0 评论 -
VC++ CEdit自绘增强版(带文件/夹浏览功能)
本文代码借鉴CMFCEditBrowseCtrl代码,综合CSWEdit代码整理成稿。头文件定义(CSWBrowseEdit.h):#pragma once// CSWBrowseEditclass CSWBrowseEdit : public CSWEdit{ DECLARE_DYNAMIC(CSWBrowseEdit)public: CSWBrowseEdit()...原创 2020-01-08 15:19:27 · 579 阅读 · 0 评论 -
WTL 界面设计篇(CSkinPictureBox)
头文件声明(CSkinPictureBox.h):#pragma once#include "SkinManager.h"#include "../GifImage.h"enum DRAW_MODE // 绘图模式{ DRAW_MODE_STRETCH, // 拉伸 DRAW_MODE_CENTER // 居中};class CSkinPictureBox : public CWindowImpl<CSkinPictureBox, CStatic>{public:原创 2020-09-29 12:05:36 · 988 阅读 · 0 评论 -
VC++ CImageList添加图标(HBITMAP、HICON)
方式1:int AddImageList(HBITMAP hBitmap){ if (hBitmap == NULL) return -1; BITMAP bmpObj; ::GetObject(hBitmap, sizeof(BITMAP), (LPVOID)&bmpObj); UINT nFlags = ILC_MASK; switch (bmpObj.bmBi...原创 2020-01-09 16:55:09 · 861 阅读 · 0 评论 -
VC++ CDialog自绘阶段性总结
实现CDialog自绘的步骤:1、就是按照下面的2个参数,将客户区分割为9宫格,然后对应的贴图,除了4个角落的图片,其他5张图片都是采用的拉伸方式贴图 RECT m_rcImageWindow; // 背景图片相对于源图片文件中裁剪下来的区域 RECT m_rcImageClient; // 9宫格中心客户区相对于源图片文件中的裁剪区域2、...原创 2020-01-02 21:42:51 · 379 阅读 · 6 评论 -
VC++ CComboBox自绘阶段性总结
在绘制列表框左侧的时候,本来说是采用的CImageList接口进行绘制,结果发现绘制后的图标不干净,有锯齿或者黑色背景存在,于是采用了GDI+来实现左侧图标的绘制。代码如下:GDI是完全可以通过图像处理彻底解决图标不干净问题的(之前文章有介绍过解决方法),但是这里偷个懒,鉴于复杂性改为GDI+比较方便。...原创 2020-01-09 23:40:19 · 395 阅读 · 0 评论 -
WTL 界面设计篇(CImageEx)
头文件声明(CImageEx.h):#pragma once#include <atlimage.h>class CImageEx : public CImage{public: CImageEx(void); virtual ~CImageEx(void);public: BOOL LoadFromFile(LPCTSTR pszFileName);// 从文件加载 BOOL LoadFromIStream(IStream* pStream);// 从内存流加载原创 2020-08-25 18:32:10 · 929 阅读 · 0 评论 -
WTL 界面设计篇(CSkinRichEdit)
头文件声明(CSkinRichEdit.h):#pragma once#include <textserv.h>#include <richedit.h>#include "SkinScrollBar.h"class CSkinRichEdit;/* * TXTEFFECT * * @enum Defines different background styles control */enum TXTEFFECT { TXTEFFECT_NONE =原创 2020-11-30 18:44:17 · 780 阅读 · 0 评论 -
VC++ CImage抠图
void SetBackgroundMaskImage(LPCTSTR lpszImageName){ COLORREF crAlpha = RGB(255, 0, 0); CImage img; img.Load(lpszImageName); if (img.IsNull()) return; struct PixelData { BYTE B; BYTE G;...原创 2020-01-06 22:33:04 · 770 阅读 · 0 评论 -
VC++ 多列表项树控件
代码是基于网络上CColumnTreeCtrl基础上整理和功能扩展,效果图如下:头文件定义(CSWListTreeCtrl.h):#pragma once#include "CSWTreeCtrl.h"class CSWListTreeCtrl : public CWnd{ typedef struct _CTVHITTESTINFO { POINT pt; UI...原创 2020-01-13 17:11:30 · 899 阅读 · 9 评论 -
VC++ CEdit自绘篇
头文件定义(CSWEdit.h):#pragma once// CSWEditclass CSWEdit : public CEdit{ DECLARE_DYNAMIC(CSWEdit)public: CSWEdit(); virtual ~CSWEdit(); void SetToolTipText(LPCSTR lpszToolTipText, BOOL bAc...原创 2020-01-08 12:49:17 · 1538 阅读 · 5 评论 -
VC++ CButton自绘(改进版)
上一版本(链接:https://blog.csdn.net/u012156872/article/details/103827466)中测试过程中发现,如果鼠标快速在几个按钮之间切换,会有闪烁的问题,说到闪烁多数人就会想到双缓存绘图,但是其实本身就已经采用的双缓存绘制模式,该会是哪里出现了问题呢?鼠标的进入和离开都是在mousemove消息事件里面通过SetCapture来处理的,这种处理方式未尝...原创 2020-01-04 22:16:08 · 575 阅读 · 1 评论 -
VC++ CDialog自绘
CSWDialog头文件声明(CSWDialog.h)原创 2019-12-31 23:15:19 · 403 阅读 · 2 评论 -
VC++ CSWDirectoryListCtrl磁盘文件列表
效果图:头文件定义(CSWDirectoryListCtrl.h):#pragma once#include "afxwin.h"#include <afxcmn.h>#include <string>namespace sw { class CSWDirectoryListCtrl: public CListCtrl { public: CSWDirectoryListCtrl(); virtual ~CSWDirectoryListCtrl(原创 2020-06-29 12:34:18 · 395 阅读 · 0 评论 -
WTL 界面设计篇(CSkinListCtrl)
头文件声明(CSkinListCtrl.h):#pragma once#include <vector>#include "SkinManager.h"#include "SkinScrollBar.h"class CLVColumn{public: CLVColumn(void); ~CLVColumn(void);public: CString m_strText; CImageEx * m_lpImage; DWORD m_dwFmt; int m_n原创 2020-11-30 18:41:33 · 470 阅读 · 0 评论 -
VC++ CComboBox自绘(颜色下拉列表框)
使用前,请将控件的Style属性设置为DropdownList(下拉列表),OwnerDraw设置为Fixed,HasStrings设置为TRUE,效果图如下:头文件声明(CSWColorComboBox.h):#pragma once#include "afxwin.h"#include <afxcmn.h>class CSWColorComboBox : ...原创 2020-01-11 20:42:48 · 3469 阅读 · 0 评论 -
WTL 界面设计篇(CSkinMenu)
头文件声明(CSkinMenu.h):#pragma once#include "SkinManager.h"#define SKIN_MENU_MAGIC 0x2010 // 皮肤菜单项目信息标识struct SKIN_MENU_ITEM_INFO // 皮肤菜单项目信息结构{ UINT nMagic; // 皮肤菜单项目信息标识 UINT nID; // 菜单ID UINT nState; // 菜单状态 UINT nType原创 2020-09-29 11:58:03 · 355 阅读 · 0 评论 -
VC++ 关于窗口刷新的几个函数InvalidateRect、UpdateWindow、RedrawWindow
在前面写了那么多自绘控件,有必要对这几个接口做下声明解释:这几个接口都是对执行窗体重绘的消息,那么什么时候才会发生重绘窗口的消息?答案是:当窗体需要更新内容或是重绘外观背景的时候,应用程序通常会发送一条WM_PAINT消息,通知窗体进行重新绘制。InvalidateRect(m_hWnd, lpRect, bErase):强制系统进行重绘,但是不一定马上会进行重绘,仅仅是通过Pos...原创 2020-01-09 09:01:52 · 2066 阅读 · 0 评论 -
VC++ 在任务栏图标上显示进度条效果
该功能主要是通过COM接口ITaskbarList3*来实现进度效果显示功能。头文件定义(CSWTaskBarList.h):#pragma once#include <Windows.h>#include <Shobjidl.h>#include <Commctrl.h>#pragma comment(lib, "Comctl32.lib")namespace sw { class CSWTaskBarList { typedef st.原创 2020-05-18 16:46:24 · 941 阅读 · 0 评论 -
VC++ CComboBox自绘前序
有关CComboBox,计划编写3个类:其1:实现在每一行Item右侧添加自定义图标HICON(一般多为删除图标,用于删除某一项)CSWComboBox其2:实现下拉列表显示树形结构CSWCheckComboBox其3:实现颜色选择下拉列表框CSWColorComboBoxCComboBox常识:1、设置下拉列表框Item高度SetItemHeight(nItem,...原创 2020-01-08 23:09:05 · 287 阅读 · 0 评论 -
WTL 界面设计篇(CSkinButton)
头文件声明(CSkinButton.h):#pragma once#include "SkinManager.h"enum SKIN_BUTTON_TYPE{ SKIN_PUSH_BUTTON, SKIN_CHECKBOX, SKIN_RADIO_BUTTON, SKIN_GROUPBOX, SKIN_ICON_BUTTON, SKIN_MENU_BUTTON};class CSkinButton : public CWindowImpl<CSkinButton, C原创 2020-09-18 12:10:52 · 1296 阅读 · 0 评论 -
VC++ CSWSwitchButton开关按钮设计
效果图:设计这个按钮可以从CButton或CStatic继承,这里我只贴出CButton的实现方式。头文件定义(CSWSwitchButton.h):#pragma once#include "afxwin.h"#include <afxcmn.h>class CSWSwitchButton : public CButton{ DECLARE_DYNAM...原创 2020-03-19 13:52:50 · 828 阅读 · 3 评论 -
VC++ CButton自绘
头文件定义(CSWButton.h):#pragma once#include "afxwin.h"#include <afxcmn.h>class CSWButton : public CButton{ DECLARE_DYNAMIC(CSWButton)public: enum BUTTON_STATUS//按钮状态 { BTNST_NULL, //...原创 2020-01-03 21:40:43 · 590 阅读 · 0 评论 -
VC++ CImageFactory类加载ICON资源文件失败
今天设计CSWComboBox控件发现CImageFactory类接口加载系统ICON资源文件失败,几经周折找到了几种解决方案,其一可以将资源文件类型ICON,改为非系统默认类型(比如MICON,ICON1等等);或者修改代码如下:Bitmap* CImageFactory::GetSkinItemImage(UINT uiResID, LPCTSTR lpszResType){ Img...原创 2020-01-09 23:46:37 · 435 阅读 · 0 评论 -
VC++ CSliderCtrl自绘
效果图:头文件声明(CSWSliderCtrl.h):#pragma once// CSWSliderCtrlnamespace sw { class CSWSliderCtrl : public CWnd { DECLARE_DYNAMIC(CSWSliderCtrl) public: CSWSliderCtrl(); virtual ~CSWSliderCtrl(); void SetToolTipText(LPCSTR lpszToolTipText原创 2020-05-18 16:41:35 · 616 阅读 · 0 评论 -
WTL 界面设计篇(CSkinEdit)
头文件声明(CSkinEdit.h):#pragma once#include "SkinManager.h"// 不支持滚动条皮肤// 图片背景支持不完整// Edit控件必须是ES_MULTILINE风格,SetMarginsEx才能生效,ES_MULTILINE风格好像不能动态修改,只能在生成控件时指定class CSkinEdit : public CWindowImpl<CSkinEdit, CEdit>{public: CSkinEdit(void);原创 2020-09-29 11:52:47 · 1255 阅读 · 0 评论 -
VC++ CTreeCtrl自绘
头文件声明(CSWTreeCtrl.h):#pragma once#define _OWNER_DRAWN_TREE // 自绘CTreeCtrl,可支持背景图片显示功能class CSWTreeCtrl : public CTreeCtrl{ friend class CSWListTreeCtrl; DECLARE_DYNAMIC(CSWTreeCtrl) // 成...原创 2020-01-13 17:13:10 · 1115 阅读 · 7 评论 -
WTL 界面设计篇(CSkinManager)
头文件声明(CSkinManager.h):#pragma once#include <vector>#include <map>#include "SysUtils.h"#include "ImageEx.h"#include "XmlDocument.h"struct SKIN_INFO // 皮肤信息{ int nSkinID; // 皮肤ID CString strSkinName; // 皮肤名称 CString strSkinPath;原创 2020-08-25 19:24:56 · 367 阅读 · 0 评论 -
VC++ CMenu菜单自绘
效果图(分隔符颜色下一个版本再完善):头文件定义(CSWMenu.h):#ifndef CSWMenu_H#define CSWMenu_H#include <afxtempl.h>namespace sw { class CSWMenuData { wchar_t* m_szMenuText; public: CSWMenuData() { menuIconNormal = -1; xoffset = -1; bitmap = NULL;原创 2020-05-18 17:08:06 · 1679 阅读 · 5 评论 -
VC++ CEdit自绘阶段性总结
在设计CSWEdit过程中,字体的设置写在了HBRUSH CSWEdit::CtlColor(CDC* pDC, UINT nCtlColor)里面,比如pDC->SelectObject(&m_font);后来经过测试发现,如果文本内容输入内容非常长,光标的末尾位置不在最右边,而是逐渐往前移动了。后来经过代码排查,发现问题出在CtlColor里面,于是乎将字体的设置放到...原创 2020-01-08 14:47:38 · 430 阅读 · 0 评论 -
WTL 界面设计篇(CSkinToolBar)
头文件声明(CSkinToolBar.h):#pragma once#include "SkinManager.h"#define STBI_STYLE_BUTTON 0x0000#define STBI_STYLE_SEPARTOR 0x0001#define STBI_STYLE_CHECK 0x0002#define STBI_STYLE_DROPDOWN 0x0008#define STBI_STYLE_WHOLEDROPDOWN 0x0080// STBI原创 2020-11-30 18:48:57 · 392 阅读 · 0 评论