`

界面编程总结(1)

    博客分类:
  • VC
阅读更多

原文地址:http://blog.csdn.net/byxdaz/archive/2010/04/18/5499564.aspx

 

我们在做程序设计时界面与功能,那个更加吸引用户的兴趣呢?这是一个很难回答的问题。拥有美丽的外观,软件就成功了一半。界面由控件、工具栏、菜单、窗体等元素组成,对他们进行美化就能得到一个美丽的界面。

目前界面编程技术包括MFCwin32 SDK CJLibraryWTL以及一些界面开发包。文本介绍MFC界面编程技术。

一、控件自绘

控件的生成包括静态控件和动态控件的生成。动态控件是在应用程序运行过程中临时产生的。所以在进行动态控件的自绘时,方法比自绘静态控件复杂些。应该考虑控件的大小、宽高等。

自绘控件类型

静态控件

动态控件

绘制步骤

1、控件具有自绘属性。

2、响应OnDrawItem函数。

1、控件具有自绘属性。

2、响应OnMeasureItem函数。

3、响应OnDrawItem函数。

 

 

 

注:控件的自画需要响应四个消息:WM_MEASUREITEM, WM_DRAWITEM, WM_COMPAREITEM, 和WM_DELETEITEM.

combo box ,list box 销毁时响应OnDeleteItem
combo ,list box 排序时响应OnCompareItem
button, combo box, list box, or menu 创建时响应OnMeasureItem
button, combo box, list box, or menu 改变时响应OnDrawItem

OnDrawItem函数说明,函数定义为:

afx_msg void OnDrawItem(int nIDCtl,LPDRAWITEMSTRUCT lpDrawItemStruct);

参数说明:

nIDCtl:发送WM_DRAWITEM消息控件的ID值,如果该值为零,表明该消息由菜单控件发出的。

LpDrawItemStruct:指向一个DRAWITEMSTRUCT结构的指针, DRAWITEMSTRUCT 为需要自绘的控件或者菜单项提供了必要的信息。在需要绘制的控件或者菜单项对应的WM_DRAWITEM消息函数中得到一个指向该结构的指针。 DRAWITEMSTRUCT结构的定义如下:
typedef struct tagDRAWITEMSTRUCT {
UINT 
CtlType
UINT CtlID

UINT itemID

UINT itemAction

UINT itemState

HWND hwndItem

HDC hDC

RECT rcItem

ULONG_PTR itemData

} DRAWITEMSTRUCT;

结构成员:

CtlType :指定了控件的类型,其取值如下表所示。

取值                                   描述

ODT_BUTTON                   按钮控件
ODT_COMBOBOX              组合框控件
ODT_LISTBOX                   列表框控件
ODT_LISTVIEW                 列表视图控件
ODT_MENU                       菜单项
ODT_STATIC                      静态文本控件
ODT_TAB                           Tab控件

CtlID 指定了自绘控件的ID值,而对于菜单项则不需要使用该成员

itemID :表示菜单项ID,也可以表示列表框或者组合框中某项的索引值。对于一个空的列表框或组合框,该成员的值为–1。这时应用程序只绘制焦点矩形(该矩形的坐标由rcItem 成员给出)虽然此时控件中没有需要显示的项,但是绘制焦点矩形还是很有必要的,因为这样做能够提示用户该控件是否具有输入焦点。当然也可以设置itemAction 成员为合适值,使得无需绘制焦点。

itemAction :指定绘制行为,其取值可以为下表中所示值的一个或者多个的联合。

取值                                          描述
ODA_DRAWENTIRE                  当整个控件都需要被绘制时,设置该值
ODA_FOCUS                             如果控件需要在获得或失去焦点时被绘制,则设置该值。此时应该检查itemState成员,以确定控件是否具有输入焦点。
ODA_SELECT                            如果控件需要在选中状态改变时被绘制,则设置该值。此时应该检查itemState 成员,以确定控件是否处于选中状态。

itemState 指定了当前绘制操作完成后,所绘项的可见状态。例如,如果菜单项应该被灰色显示,则可以指定ODS_GRAYED状态标志。其取值可以为下表中所示值的一个或者多个的联合。

取值                                          描述
ODS_CHECKED                         如果菜单项将被选中,则可设置该值。该值只对菜单项有用。
ODS_COMBOBOXEDIT             在自绘组合框控件中只绘制选择区域。
ODS_DEFAULT                          默认值。
ODS_DISABLED                        如果控件将被禁止,则设置该值。
ODS_FOCUS                             如果控件需要输入焦点,则设置该值。
ODS_GRAYED                           如果控件需要被灰色显示,则设置该值。该值只在绘制菜单时使用。
ODS_HOTLIGHT                       Windows 98/Me, Windows 2000/XP: 如果鼠标指针位于控件之上,则设置该值,这时控件会显示高亮颜色。
ODS_INACTIVE                        Windows 98/Me, Windows 2000/XP: 表示没有激活的菜单项。
ODS_NOACCEL                         Windows 2000/XP: 控件是否有快速键盘。
ODS_NOFOCUSRECT                Windows 2000/XP: 不绘制捕获焦点的效果。
ODS_SELECTED                       选中的菜单项。

hwndItem :指定了组合框、列表框和按钮等自绘控件的窗口句柄;如果自绘的对象时菜单项,则表示包含该菜单项的菜单句柄。

hDC :指定了绘制操作所使用的设备环境。

rcItem :指定了将被绘制的矩形区域。这个矩形区域就是上面hDC的作用范围。系统会自动裁剪组合框、列表框或按钮等控件的自绘制区域以外的部分。也就是说rcItem中的坐标点(00)指的就是控件的左上角。但是系统不裁剪菜单项,所以在绘制菜单项的时候,必须先通过一定的换算得到该菜单项的位置,以保证绘制操作在我们希望的区域中进行。

itemData 

对于菜单项,该成员的取值可以是由CMenu::AppendMenuCMenu::InsertMenu或者CMenu::ModifyMenu等函数传递给菜单的值。

对于列表框或这组合框,该成员的值可以为由ComboBox::AddStringCComboBox::InsertStringCListBox::AddString或者CListBox::InsertString等传递给控件的值。

如果ctlType 的取值是ODT_BUTTON或者ODT_STATIC, itemData的取值为0

 

OnMeasureItem函数说明,函数定位:

afx_msg void OnMeasureItem(int nIDCtl,LPMEASUREITEMSTRUCT lpMeasureItemStruct);

参数说明:

nIDCtl:发送WM_MEASUREITEM消息控件的ID值,如果该值为零,表明该消息是由菜单控件发出的。

LpMeasureItemStruct:指向一个MEASUREITEMSTRUCT结构的指针,它的数据结构定义如下:

typedef struct tagMEASUREITEMSTRUCT {

    UINT  CtlType;

UINT  CtlID;

UINT  itemID;

UINT  itemWidth;

    UINT  itemHeight;

    DWORD itemData;

} MEASUREITEMSTRUCT;

 

CtlType:指定控件的类型.这个成员可以是下列的一个值:

取值                           描述

ODT_BUTTON          自绘按钮

ODT_COMBOBOX             自绘组合框

ODT_LISTBOX            自绘列表框

ODT_LISTVIEW           自绘列表视图控件

ODT_MENU                 自绘菜单

 

CtlID:指定组合框(combo box), 列表框(list box),  控钮(button)的标识符.这个成员不能在菜单中使用

ItemID:指定菜单项的标识符或组合框(combo box), 列表框(list box)的位置索引。列表框(list box)风格已经有LBS_OWNERDRAWVARIABLE时这个值才被指定。组合框(combo box)风格已经有CBS_OWNERDRAWVARIABLE风格时这个值才被指定。

ItemWidth:指定宽,单位象素,一个菜单项目.在从消息返回之前,自绘菜单项的所有者必需填充这个成员。

ItemHeight:指定高,单位象素,列表框(list box)一个个别的项或一个菜单.在从消息返回之前自绘组合框,列表框或菜单项必需填写这个参数。

ItemData:指定与应用程序定义的菜单项相关联的32位值.做为控件,这个参数指定值是最后指定给列表框(list box)或组合框(combo box)LB_SETITEMDATACB_SETITEMDATA消息中的值.如果列表框(list box)或组合框(combo box)已经使用LB_HASSTRINGSCB_HASSTRINGS风格这个最初值是零.否则,这个值最初的值是传给列表框(list box)或组合框(combo box)下列消息中lparam参数的一个值:

 CB_ADDSTRING

 CB_INSERTSTRING

 LB_ADDSTRING

 LB_INSERTSTRING

 

WM_MEASUREITEMWM_DRAWITEM区别:在WM_MEASUREITEM消息影射函数中设置当前要画的Item的大小尺寸;创建控件。在WM_DRAWITEM消息影射函数中根据Item的大小尺寸来画该Item(图标/位图/字符串等)

 

二、常用控件使用方法

1、按钮类

CButtonST目前见过的最强大,功能最全的CButton派生类。具体使用方法参考:http://www.vckbase.com/document/viewdoc/?id=517

2菜单

自绘菜单的实现:

http://www.vckbase.com/document/viewdoc/?id=1200

3、工具条使用方法
http://www.vckbase.com/document/viewdoc/?id=629
http://www.vckbase.com/document/listdoc.asp?mclsid=3&sclsid=305

4、CToolTipCtrl使用方法

ToolTip是Win32中一个通用控件,用于提示信息的显示,MFC中为其生成了一个类CToolTipCtrl,总的说来其使用方法是较简单的,下面讲一下它的一般用法和高级用法。

一般用法步骤:

添加CToolTipCtrl成员变量 m_tt。

在父窗口中调用EnableToolTips(TRUE);

在窗口的OnCreate(或者其他适当的位置)中向ToolTip中添加需要显示Tip的子窗口,并同时指定相应的显示字串CToolTipCtrl::AddTool(pWnd,"string to display")。

重载父窗口的 BOOL PreTranslateMessage(MSG* pMsg) ,在函数中调用 m_tt.RelayEvent(pMsg)。

下面假设在窗口CWndYour中使用CToolTipCtrl

在类定义中添加变量说明:

class CWndYour:xxx

line-height: 19px;

分享到:
评论

相关推荐

    VC界面编程总结

    VC界面编程总结

    VC界面编程宝典(界面编程总结)

    绝佳的VC界面编程宝典,包含96例,还有详细讲解!例如:自绘菜单的实现,在VC中透明浮动按键的实现,用VC设计托盘图标程序,图像平滑滚动效果的VC实现,利用钩子实现菜单阴影效果,在VC下显示JPEG、GIF格式图像的一...

    VC界面编程总结与基本应用

    【VC界面编程总结与基本应用】 在Windows编程中,Visual C++(简称VC)提供了一个强大的平台用于开发具有用户友好的图形用户界面(GUI)的应用程序。本篇内容主要涉及VC界面编程的一些关键知识点和常见操作,包括...

    C界面编程总结.p

    正如标题所述,“C界面编程总结”聚焦于界面编程的核心技巧,尤其是如何优化Visual C++(以下简称VC)中的界面设计。本文将深入探讨文件中提及的几个关键知识点,包括美化界面元素如控件、工具栏、菜单、窗体,以及...

    一个图形界面编程

    ### 图形界面编程入门——MATLAB图形用户界面(GUI)详解 #### 一、引言 随着计算机技术的发展,图形用户界面(GUI)已经成为软件开发不可或缺的一部分。MATLAB作为一种广泛应用于科学计算、算法开发和数据分析的...

    java图形界面编程

    ### Java图形界面编程知识点概述 #### 一、Java图形界面编程简介 Java图形界面编程,简称GUI编程,是指使用Java语言开发用户界面的过程。通过GUI编程,开发者可以创建直观、友好的用户界面,使得用户可以通过点击...

    matlabGUI界面编程示例

    - **`matlabGUI编程总结.pdf`**:这份文档很可能包含了GUI编程的关键概念、步骤和技巧的总结,是学习MATLAB GUI的宝贵资料。 - **`matlab界面示例.rar`**:这个压缩文件可能包含了一些实际的GUI示例代码,通过解压...

    MFC界面基础编程4步走

    在开始任何界面编程之前,你需要创建一个基于MFC的应用程序项目。在Visual Studio中,选择"新建项目",然后选择"MFC应用程序"模板。这将为你生成一个基础的MFC项目框架,包括主窗口类(如CMainFrame)和应用程序类...

    VC界面类编程经验总结

    一、MFC与VC界面编程 MFC是微软提供的一套面向对象的C++类库,用于简化Windows应用程序开发,特别是GUI(图形用户界面)编程。它封装了Windows API,使得开发者可以更加高效地创建功能丰富的界面。 二、窗口类CWnd ...

    源码-一个实例搞定MATLAB界面编程

    ### 源码解析:MATLAB界面编程实例详解 #### 一、引言 本文将对一份MATLAB界面编程的源代码进行详细解读,旨在帮助读者理解如何在MATLAB环境中创建用户界面。通过分析这份代码,我们将深入了解MATLAB界面编程的基础...

    matlab 界面编程,立体视觉实例搞定.rar_MATLAB 实例_参数估计_界面编程matlab_立体界面编程_立体视觉

    总结来说,这个实例教程旨在教授如何结合MATLAB的界面编程能力和立体视觉理论,构建一个能够处理和展示立体视觉数据的应用程序。通过学习和实践,你可以提升在MATLAB环境下的编程和视觉处理技能,为未来在相关领域的...

    java图形界面编程插件

    总结来说,Java图形界面编程插件,特别是SWING插件,为开发者提供了强大且便捷的GUI开发工具。通过在MyEclipse这样的集成开发环境中集成SWING插件,开发者可以利用其可视化特性快速构建和调试Java桌面应用的用户界面...

    VC界面类编程 VC界面类编程 VC界面类编程

    在VC界面编程中,对话框是一种临时的窗口,用于收集用户输入或显示信息。CDialog类是对话框的基础,派生自CWnd。开发者可以通过定义资源文件中的对话框模板,然后在代码中创建CDialog的实例来实现。 四、控件类 ...

    《一个实例搞定MATLAB界面编程》——matlab-gui界面编程入门教程

    ### MATLAB GUI界面编程知识点详解 #### 一、MATLAB GUI编程概述 - **GUI(Graphical User Interface)**: 图形用户界面,允许用户通过图形化的元素(如按钮、文本框等)与应用程序交互的一种方式。 - **MATLAB ...

    一个实例搞定MATLAB界面编程.rar_GUI实例_matlab GUI_matlab GUI编程_matlabGUI实例_m

    本资源“一个实例搞定MATLAB界面编程.rar”是一个专为MATLAB GUI设计的实例教程,旨在帮助用户快速理解和掌握MATLAB GUI的开发技巧。 GUI在MATLAB中的实现主要依赖于GUIDE(Graphical User Interface Development ...

    VC界面编程相关的技术文档

    "VC界面编程总结.pdf"可能涵盖了以上知识点的概述和实践经验,而"VC界面编程宝典.zip"可能包含更深入的技术细节、示例代码以及实用技巧,帮助读者深入理解并掌握VC界面编程。通过学习这些文档,开发者不仅可以提升...

    嵌入式用户图形界面编程

    总结来说,嵌入式用户图形界面编程是一个充满挑战和创造性的领域,它要求开发者不仅要有扎实的编程技能,还需要对图形学、人机交互设计以及相关硬件平台有深刻的理解。随着技术的不断进步,嵌入式用户图形界面编程将...

    Java GUI图形化用户界面编程的基础知识

    ### Java GUI图形化用户界面编程的基础知识 #### 一、Java GUI编程概述 Java的GUI编程(Graphic User Interface,图形用户接口),是在它的抽象窗口工具箱(Abstract Window Toolkit,AWT)的基础上实现的。Java中...

    台达B系列人机界面编程软件ScreenEditor 2.00.rar

    总结来说,台达B系列人机界面编程软件ScreenEditor 2.00是一款功能强大且易用的工具,它简化了HMI应用开发流程,提高了设备操作的便捷性和效率。对于工业自动化领域的工程师和开发者而言,掌握ScreenEditor的使用将...

Global site tag (gtag.js) - Google Analytics