mfc修改主窗口风格和窗口类

合集下载

MFC中各种控件透明的实现方法总结

MFC中各种控件透明的实现方法总结

MFC中各种控件透明的实现方法总结在MFC中实现控件透明的方法有多种,下面总结了几种常用的方法:
1.使用窗口风格(WS_EX_TRANSPARENT):在控件的创建过程中,使用WS_EX_TRANSPARENT风格可以使控件透明。

这个风格将使控件透明并允许鼠标事件穿透到控件底下的其他控件上。

2. 设置背景透明:可以通过重载控件的OnEraseBkgnd函数,将背景绘制为透明的,实现控件的透明效果。

具体的实现方法是,将背景绘制为透明色,并返回TRUE。

3.使用位图作为控件背景:可以使用透明位图作为控件的背景,这样控件就可以显示位图中的内容,并实现透明效果。

具体的实现方法是,将位图加载进内存DC中,然后将内存DC中的图像绘制到控件的DC上。

4.通过子类化控件:通过子类化控件,可以拦截并处理控件的绘制消息,从而实现透明效果。

具体的实现方法是,创建一个继承自原始控件类的子类,并重载子类的绘制函数,将背景绘制为透明。

6. 使用窗口类别(WS_EX_LAYERED):在控件的创建过程中,使用WS_EX_LAYERED风格可以使控件透明。

这个风格将使控件的窗口使用Alpha混合来控制窗口的透明度。

以上是一些常用的方法来实现MFC中各种控件的透明效果。

根据具体的需求和控件类型,选择适合的方法来实现透明效果。

需要注意的是,在使用透明效果时,需要确保控件的父窗口也是透明的,否则无法实现完全透明的效果。

7.MFC界面与美化

7.MFC界面与美化

7.2窗口图标与背景修改

7.2.2 修改背景 步骤



1、创建兼容设备描述表 2、创建、装入位图 3、位图选入兼容设备描述表 4、将兼容设备描述表复制到当前设备描述表

详见例7-2

修改背景(实例 7-2) 步骤


1、新建MFC单文档App(ChangeBackground) 2、资源面板添加一个位图资源 3、在CChangeBackgroundView::OnDraw()贴图

2、 MainFrame::OnCreate()

修改窗口外观
视图类中修改 (例7-3 CFra bibliotekangeFrm)


1、 ChangeFrm::PreCreateWindows()


修改WNDCLASS AfxRegisterWndClass() SetClassLong()

2、 ChangeFrm ::OnCreate()
7.3工具栏编程与美化

7.3.1 创建工具栏

增加一个工具栏资源 框架类头文件中声明 CMFCToolBar对象 CMainFrame::OnCreate()中创建工具栏并加载
(可参考向导生成的标准工具栏)

7.3.2 工具栏中添加、删除按钮

编辑位图 修改按钮属性(ID,Width,Height,Prompt) 调整顺序、增加分割线、删除按钮
在该函数返回前 1、先调用PreCreateWindow(),对Create()/CreateEx()中的风格参 数进行预处理设置 2、调用OnCreate() 进行实际的窗口创建

VS2010 更改MFC标题及标题栏图标和exe图标

VS2010 更改MFC标题及标题栏图标和exe图标

VS2010 更改MFC标题及标题栏图标和exe图标在VS2010下新建一个MFC的多文档应用程序,程序默认的标题是“文档名-工程名”。

图标默认的是写着MFC的三个方块。

但在很多软件中都不是使用的默认设置,开发者们都将标题和图标改过,以符合项目要求,而且直观好看。

一修改标题(一)基于MFC对话框*对话框标题栏内容为静态MFC对话框型程序动态修改自身标题的方法有以下几种:1. 直接在资源视图-Dialog-属性-外观的“Caption”中修改。

2. 最简单的是用对话框类自身的类函数:BOOL CMyDlg::OnInitDialog(){CDialog::OnInitDialog();......SetWindowText("My Title");return TRUE; // return TRUE unless you set the focus to a control}3. 其次还可以用API函数来完成:::SetWindowText(m_hWnd, "My Title"); 或 ::SetWindowText(GetSafeHwnd(), "My Title");m_hWnd也是MFC对话框类的成员变量,可直接引用,GetSafeHwnd()的作用与其一样。

*对话框标题栏内容为动态生成的在对应对话框的初始化函数OnInitDialog()中添加以下代码:CString title;title.Format("%d",Id);//在标题栏动态显示Id的值this->SetWindowText(title);(二)基于MFC单、多文档标题分为前后两部分,前面一部分默认是文档名,后面一部分默认是工程名,比如我新建一个叫做UITEST的工程,那标题就是“UITEST1-UITEST”。

后面都用这个工程为例。

1.修改前半部分:可以重载文档类的虚函数SetTile,如下void CTestDoc::SetTitle(LPCTSTR lpszTitle){CDocument::SetTitle(L"你的标题");}也可以在UITESTDoc.app中,在BOOL CUITESTDoc::OnNewDocument()函数中添加SetTitle(L"你的标题")2.修改后半部分:改资源字符串在资源视图的String Table中找到IDR_MAINFRAME,将其标题改为你想要的标题3.去掉-:去掉标题中间的-,只显示后面的标题,方法1:通过重载CFramWnd类的OnUpdateFrameTitle函数virtual void OnUpdateFrameTitle(BOOL NaDa);void CMainFrame.:OnUpdateFrameTitle(BOOL NaDa){CString csAppName;csAppName.Format(AFX_IDS_APP_TITLE);SetWindowText(csAppName);}此时显示的结果只有字符串资源AFX_IDS_APP_TITLE所定义的字符串,当然也可以把SetWindowText(csAppName)中的csAppName换成你想要的标题字符串。

VC++6[1].0入门【第三章、MFC编程概述】

VC++6[1].0入门【第三章、MFC编程概述】

第三章 MFC 应用程序概述第3章 MFC 应用程序概述Microsoft Windows 是微软公司推出的一个应用于微机上的具有图形用户界面的多任务和多窗口的操作系统。

Windows 应用程序也称为窗口应用程序,所有的窗口应用程序都有着相同的窗口风格和菜单结构,用户界面友好,方便用户操作。

本章从剖析窗口应用程序的基本结构入手,继而介绍使用MFC 类库开发的应用程序框架结构,并介绍窗口应用程序运行的核心机制-消息映射。

学习了本章,你将对MFC 应用程序框架结构和运行机制有个整体的了解,为后面进入窗口应用程序开发打下良好的基础。

3.1 窗口应用程序概述窗口应用程序的开发一般采用可视化的面向对象的开发,可选择的窗口应用程序开发语言有Visual C++、Visual Basic 、Visual Java 、Dephi 等等。

无论采用哪一种开发语言,首先要了解窗口应用程序的基本机制。

3.1.1 窗口编程基础窗口应用程序运行于Windows 操作系统,Windows操作系统是一个多任务操作系统,因此窗口应用程序的组成,支持技术,基本运行机制等与DOS 应用程序有着本质的区别。

在学习开发窗口应用程序之前,先要对窗口应用程序有一个概念上的了解。

1. 窗口窗口是应用程序与用户进行交互的界面,应用程序通过窗口传递信息给用户,同样用户通过窗口输入数据,发布命令给应用程序。

Windows 界面包含了丰富的标准用户界面元素,包括窗口、图标、菜单、滚动条、对话框、控件和消息框等。

用户使用这些界面元素可以方便的与应用程序进行交互,一个典型的窗口外观如图3-1所示。

垂直滚动条控制菜单栏标题栏菜单栏关闭按钮最小化按钮最大化按钮客户区VC++6简明教程图3-1 Windows应用程序窗口组成在Windows编程中,各种窗口、菜单、按钮、对话框及程序模块等Windows的规范部件是按“对象”来组织的。

为了提高开发窗口应用程序的效率,微软公司为用户提供了大量能创建上述标准元素的API函数和C++类,并且以Windows API函数库和C++类库的形式提供给用户,以充分满足构成应用程序操作界面的需要。

VC++中修改MFC窗口标题

VC++中修改MFC窗口标题
if (!CDocument::OnNewDocument())
return FALSE;
SetTitle (" 文档标题 " );
return TRUE;
}
运行程序,则每次选择选单中的“文件”的“新建”选项时,文档标题就变成 “文档标题- SDITitle”。
5) 是在CMainFrame的PreCreateWindow函数中修改窗口风格:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style &= ~(LONG) FWS_ADDTOTITLE;
return CFrameWnd::PreCreateWindow(cs);
BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style &=~ (LONG) FWS_ADDTOTITLE;
return CMDIChildWnd::PreCreateWindow(cs);
}
改变窗口类型,这步工作必须做。常量FWS_ADDTOTITLE是在文件\ msdev \ mfc \include \afxwin.h中定义。
VC++中修改MFC窗口标题
一·单文档接口(SDI)类型窗口标题的改变
首先,我们来看Windows SDI类型窗口标题栏的结构形式。结合具体例子说明:用VC的AppWizard创建一个名为“SDITitle”的单文档类型的工程,创建完工程后,编译运行该工程,程序主窗口标题形式如下:
文档标题 主窗口标题

MFC---视图和窗口

MFC---视图和窗口

MFC---视图和窗⼝视类窗⼝是指程序运⾏后,显⽰信息的那⼀部分。

对应的类是CTestOneView (TestOne 表⽰项⽬名称)类,CTestOneView 类是派⽣于CView 类,⽽CView 类⼜派⽣于CWnd 类。

他们的继承关系可以通过查找类的定义来查看继承关系。

视图类CView ,拥有窗⼝的客户区域,负责显⽰⽂档数据,接受⽤户的输⼊,提供⽂档与⽤户的通信。

视类窗⼝只是主框架窗⼝中空⽩的部分。

主框架窗⼝是指程序运⾏后,程序的整个界⾯。

对应的类是CMainFrame ,CMainFrame 类派⽣于CFrameWnd 类,⽽CFrameWnd 类⼜⼜派⽣于CWnd 类。

主框架窗⼝就是整个应⽤程序外框所包括的部分,主框架窗⼝是视类窗⼝的⼀个⽗窗⼝。

⽂档类CDcoument ,负责维护应⽤程序所需要的数据,提供⼀系列可对这些数据进⾏操作的⽅法,并且能够为视图提供所需的数据。

新建⼀个MFC 单⽂档应⽤程序,项⽬名称为SDITest 。

从项⽬结构中可以看到SDITest 程序中还有⼀个CSDITestDoc 类,它派⽣于CDocument 类,CDocument 类的基类是CCmdTarget ,⽽CCmdTarget ⼜派⽣于CObject 类,从⽽可知这个CSDITestDoc 类不是⼀个窗⼝类,实际上是⼀个⽂档类。

MFC 提供的⽂档/视(Document/View )结构,能够把数据本⾝与它的显⽰分离开,其中⽂档是指CDocument 类,视类是指CView 类。

数据的存储和加载由⽂档类来完成,数据的显⽰和修改则由视类完成,从⽽把数据的管理和显⽰⽅法分离开来。

下⾯介绍⼀下MFC 单⽂档程序是如何将⽂档类对象、框架对象、视类对象组织在⼀起的。

在源⽂件SDITest.cpp 中找到CSDITestApp 类的InitInstance 函数定义,有下⾯这⼀段代码:从上⾯的代码段中可知,定义了⼀个单⽂档模板对象指针pDocTemplate ,这个对象把⽂档对象、框架对象、视类对象有机地组织在⼀起,形成了⼀个有机的整体,程序接着利⽤AddDocTemplate 函数把这个单⽂档模板添加到⽂档模板中,从⽽把这三个类组织为⼀个整体。

MFC使用的风格

MFC使用的风格

MFC使用的风格当你创建相应的MFC时,使用下列风格。

在大多数情况下,这些风格通常在类的Create函数的dwStyle参数中设置。

按钮风格·BS_AUTOCHECKBOX 与复选框相同,但是当用户选择复选框时,检查标记出现在复选框中,而当用户再一次选择复选框时,检查标记就消失。

·BS_AUTORADIOBUTTON 与单项按钮相同,但是当用户选择它的时候,这个按钮自动加亮显示自己并去掉同组中相同风格的其它单项按钮的选择状态。

·BS_AUTO3STA TE 与三态复选框相同,但是当用户选择该框时它会改变自己的状态。

·BS_CHECKBOX 创建一个小方块,在它的右边显示文本(除非这个风格与BS_LEFTTEXT风格一起使用)。

·BS_DEFPUSHBUTTON 创建一个具有深黑边界的按钮。

用户可以按下ENTER键以选择这个按钮。

这个风格使用户可以快速地选择最相似的选项(缺省选项)。

·BS_GROUPBOX 创建一个矩形区域,其中的按钮是成组的。

与这种风格相关的任何文本将显示在矩形的左上角。

·BS_LEFTTEXT 当与单项按钮风格或复选框风格一起使用时,文本出现在单项按钮或复选框的左边。

·BS_OWNERDRAW 创建一个自画按钮。

当按钮的视觉状态发生改变时,框架调用DrawItem成员函数。

当使用CBitmapButton类的时候,必须设置这个风格。

·BS_PUSHBUTTON 创建一个按钮,当用户选择该按钮时向所有者窗口发送一个WM_COMMAND消息。

·BS_RADIOBUTTON 创建一个小圆形区域,在它的右边显示文本(除非这个风格与BS_LEFTTEXT风格一起使用)。

单项按钮通常成组使用但是只能独占选择。

·BS_3STATE 与复选框类似,但是这个框不仅可以被选中,还可以被变灰。

关于窗口属性的更改

关于窗口属性的更改
cs.style&=~FWS_ADDTOTITLE;
cs.lpszName="seven Window name";
MFC自带的主框架属性是:cs.style=WS_OVERLAPPEDWINDOW | WS_ADDTOTITLE
(3)在窗口创建之前可改变的其他属性见CREATESTRUCT类型
(6)、用Get和Set配合去掉窗口的最大化框:
SetWindowLong(m_hWnd,GWL_STYLE,
GetWindowLong(m_hWnd,GWL_STYLE) & ~WS_MAXIMIZEBOX);
RegisterClass(&wndcls);
//改变cs中的创建窗口用的类名为我们自己的类
//就行,不用再Create()的
//在框架中只能改变窗口图标,光标背景等是CView类的
cs.lpszClass="seven1";
//在CView类的PreCreateWindow()中也改一下:
3、MFC的使用:AfxRegisterClass()创建一个窗口类
在堆栈或者堆中创建CWnd对象-》调用成员Create()或者CreateEx()
-》调用::CreateWindowEx()创建窗口对象,句柄给CWnd
CWnd::m_hWnd存放对象关联的窗口对象
LoadCursor(NULL,IDC_CROSS),
(HBRUSH)GetStockObject(BLACK_BRUSH),
0);
其缺省参数后三个:0,0,0-》
图标:默认波浪形。光标:默认箭头。背景:默认透明。
10、在窗口创建之后,改变图标光标背景:

我整理的MFC界面美化

我整理的MFC界面美化

一,对话框背景为一幅位图1.插入位图打开VC6.0MFC程序,右击“Dialog”,打开“引入”,选择图片就可以引入一个位图了。

2.打开“ClassView”,再打开“CAbouttDlg()”函数,找到void CTuxingDlg::OnPaint()函数,粘贴上CPaintDC dc(this);CRect rect;GetClientRect(&rect);CDC dcMem;dcMem.CreateCompatibleDC(&dc);CBitmap bmpBackground;bmpBackground.LoadBitmap(IDB_BITMAP1);//IDB_BITMAP1是你自己的图对应的IDBITMAP bitmap;bmpBackground.GetBitmap(&bitmap);CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);二.在对话框上显示一幅位图法一:把图片引入工程,其句柄名为IDB_BITMAP2;然后放一个静态控件或者图片控件到对话框上,将其句柄名设为IDC_SHOWBMP; 具体代码为在需要使用的地方(如按钮函数或OnInitDialog()或OnPaint()里等等)加入如下代码:CStatic *p =(CStatic *)GetDlgItem(IDC_SHOWBMP);HBITMAP hBitmap=::LoadBitmap(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_BITMAP2));p->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);p->SetBitmap(hBitmap);详解:CStatic *p =(CStatic *)GetDlgItem(IDC_SHOWBMP); //获得指向IDC_SHOWBMP的指针,并将其强制转换为CStatic*类型,并赋值给pHBITMAP hBitmap=::LoadBitmap(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_BITMAP2));//从工程资源处获得IDB_BITMAP2的位图句柄,并将其赋值给hBitmap变量p->Modifystyle(0xF,SS_BITMAP|SS_CENTERIMAGE);//设置该静态控件(p指向的静态控件),使其用于显示位图,并且是在控件中央显示//(若无此步无法显示,因为没有说明静态对话框要显示的类型是什么)p->SetBitmap(hBitmap);//将需要显示的位图设置为bBitmap,即资源IDB_BITMAP1的句柄法二:通过位图所在路径显示位图(此方法无需事先将位图文件添加为该工程的资源) 在对话框上放一个静态控件(一定是静态控件,若图片控件则无法显示) 将其重命名为IDC_BMP(不重命名的话无法添加变量),然后再为该控件添加一个变量,命名为m_image.在需要使用的地方(如按钮函数或OnInitDialog()或OnPaint()里等等)加入如下代码: this->m_image.ModifyStyle(0,SS_BITMAP |SS_CENTERIMAGE);HBITMAP hBmp = (HBITMAP)::LoadImage(0, "path\\1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);this->m_image.SetBitmap(hBmp);详解:this->m_image.ModifyStyle(0,SS_BITMAP |SS_CENTERIMAGE);//和上面的作用一样,将该静态控件设置为是用来显示位图的,只不过这里是通过该静态对话框的变量来进行/ /modifystyle操作的HBITMAP hBmp = (HBITMAP)::LoadImage(0, "path\\1.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); //从bmp文件所在的路径直接读取该bmp图象的句柄,并将其转换为HBITMAP类型//注:其中的"path\\1.bmp"是相对路径,即在和可执行文件的同一目录下有一个名为path的文件夹,里面有一个名为1.bmp的位图文件.this->m_image.SetBitmap(hBmp); //通过变量m_image来设置该静态框所显示的位图文件.三.列表控件的背景在BOOL CTuxingDlg::OnInitDialog()函数中添加以下代码m_List.SetBkColor(RGB(444, 233, 255)); //三个参数可以任意改变,下同m_List.SetTextBkColor(RGB(444, 233, 255));四.设置列表控件属性带有表格线在BOOL CTuxingDlg::OnInitDialog()函数中添加以下代码DWORD NewStyle = m_List.GetExtendedStyle();NewStyle |= LVS_EX_GRIDLINES; m_List.SetExtendedStyle(NewStyle);五.改变全部界面的背景颜色点击“Globals”,再打开“theApp”,在Bool CPersonalFinancialManagementSystemApp::InitInstance()函数中添加SetDialogBkColor(RGB(444, 233, 255), RGB(0, 0, 0));。

MFC中CWnd类及其派生类对话框、消息处理、窗口操作

MFC中CWnd类及其派生类对话框、消息处理、窗口操作

MFC中CWnd类及其派生类对话框、消息处理、窗口操作CWnd类我们在屏幕上看到的所有对象都和窗口有关,它们或者派生于CWnd,属继承关系,如对话框、工具栏、状态栏、子控件;或者被CWnd合成,属服务员与服务对象关系,如图标、菜单、显示设备。

CWnd类封装的窗口操作主要包含窗口的创建和销毁、操作窗口风格、操作窗口状态、窗口子类化、获取指定窗口等。

当然,CWnd还实现了其他功能:1、绘制窗口GetDC()//取得客户区显示设备上下文GetWindowsDC()//取得整个窗口的显示设备上下文ReleaseDC()BeginPaint()EndPaint()PrintClient()RedrawWindow()//重绘客户区的某区域2、操作窗口子控件GetDlgItem():取得(临时的)控件对象指针SetDlgItemText()和GetDlgItemText():设置、取得控件标题SubclassDlgItem():将控件句柄与相应类相关联DlgDirList()和DlgDirListComboBox():以文件列表或目录列表填充(组合框)列表框CheckDlgButton()和CheckRadioButton():设置复选框(单选按钮)状态。

GetNextDlgTabItem():取得下一个WS_TABSTOP风格控件3、窗口定时器SetTimer():设置定时器KillTimer():销毁定时器4、窗口消息的相关函数GetCurrentMessage():取得当前被处理的消息PreTranslateMessage():可重载的虚函数。

被UI线程的消息循环调用,可以过滤窗口收到的消息,过滤出的消息得以分发SendMessage():向本窗口发送消息。

不通过消息循环,直接调用窗口函数处理消息。

窗口函数执行完毕,该函数才返回PostMessage():向本窗口寄送消息。

将消息放入消息队列,立即返回。

MFC学习总结 (67个技巧) dlg 上建立View

MFC学习总结 (67个技巧) dlg 上建立View

MFC学习总结(67个技巧) dlg 上建立View1."属性页的添加:创建对话框的类,该类要从CpropertyPage继承;然后在要添加该对话框为属性页的类(头文件)里创建CpropertySheet类的一个对象m_tabsheet和新创建的对话框类的对象m_skatch;最后,在.cpp文件里的OnInitDialog()之类的函数里实现如下代码:m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, 0);"//使选项卡的按钮在下面"if(m_tabsheet.m_hWnd)"m_tabsheet.ShowWindow(SW_MAXIMIZE);//显示选项卡//加入标签,标签名由各个子对话框的标题栏决定"m_tabsheet.AddPage(&m_skatch);"//用Create来创建一个属性页"m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT);"RECT rect;"m_tabsheet.GetWindowRect(&rect);"int width = rect.right - rect.left;"int height = rect.bottom - rect.top;""//调整属性页的大小和位置"m_tabsheet.SetWindowPos(NULL, 225, 225, width-82, height,SWP_NOACTIVATE);属性页的添加完成。

如果要添加多个属性页,则只需要增加多个对象,如下:m_tabsheet.AddPage(&m_skatch1);m_tabsheet.AddPage(&m_skatch2);. . . . . .2."List Control中标题栏(Column)的添加:创建一个List Control,其ID为IDC_LIST,在其Styles属性项下的View项里选择Report、Align 项里选择Top、Sort项里选择None.然后在该List所在对话框的类(头文件)里创建ClistCtrl的一个对象m_list然后在.cpp文件的OnInitDialog()之类的函数里实现如下代码:CString strname[3];strname[0]="Screen Name";strname[1]="Form ID";strname[2]="Category Path";for(int i=0;i<3;i++){m_List.InsertColumn(i,strname[i],LVCFMT_LEFT,130);}在这之前也要将List Control的ID与ClistCtrl的对象m_list在DoDataExchange(CDataExchange* pDX)函数里绑定,如下:DDX_Control(pDX, IDC_LIST, m_List);3."ToolBar和StatusBar中控件的添加:方法⑴.只能在ToolBar里创建控件:首先,在ToolBar中创建一个Button,其ID为ID_TOOL_COMBO(我们要将创建的控件放在该Button的位置上).其次,新创建一个类CMainToolBar,要从CToolBar继承(创建过程大概如下:选择工程/增加到工程/新的类;也可以选择工程的根,然后点击右键,选择新的类;或者CTL+W,选择增加类/新的类--- 然后在class type里选择Generic Class,在Name栏里输入新类的名字,Base class 里输入CToolBar),创建成功后在该类里创建要增加的控件的对象,如:CComboBox""m_wndMyCombo;CStatic""m_wndCategory, m_wndCategoryPath;CButton""m_wndOpenButton;Cedit"""m_wndEdit;然后在构造函数里初始化如:m_wndMyCombo.m_hWnd = NULL;m_wndCategory.m_hWnd = NULL;m_wndCategoryPath.m_hWnd = NULL;m_wndOpenButton.m_hWnd = NULL;m_wndEdit.m_hWnd = NULL;接着在CMainframe的头文件里创建CMainToolBar的一个对象m_wndToolBar,最后在.cpp 文件的OnCreate函数的最后实现如下:"int index = 0;"CRect rect;// 可定义在头文件当中"//ComboBox"{""//找到指定的工具项""while(m_wndToolBar.GetItemID(index)!=ID_TOOL_COMBO)"""index++;""//设置指定工具项的宽度并获取新的区域120是宽度""m_wndToolBar.SetButtonInfo(index, ID_TOOL_COMBO, TBBS_SEPARATOR, 120); ""m_wndToolBar.GetItemRect(index, &rect);""""//设置位置""rect.top+=1;""rect.bottom += 200;""""// 创建并显示控件""if(!m_wndToolBar.m_wndMyCombo.Create(WS_CHILD|WS_VISIBLE|CBS_AUTOHSCROLL|"""CBS_DROPDOWNLIST | CBS_HASSTRINGS , rect, &m_wndToolBar,ID_TOOL_COMBO))""{"""TRACE0("Failed to create combo-box\n");"""return FALSE;""m_wndToolBar.m_wndMyCombo.ShowWindow(SW_SHOW);""""//填充内容"""m_wndToolBar.m_wndMyCombo.AddString("25%");""m_wndToolBar.m_wndMyCombo.AddString("50%");""m_wndToolBar.m_wndMyCombo.AddString("75%");"""//选择默认项""m_wndToolBar.m_wndMyCombo.SetCurSel(0);""""//获取到内容并MSGBOX显示出来""CString strContent;""m_wndToolBar.m_wndMyCombo.GetWindowText(strContent);""index = 0;"}其他控件都类似创建(只需要注意一下各自的Create函数的参数即可)。

修改MFC应用程序的图标、光标、托盘图标、窗口风格的方法

修改MFC应用程序的图标、光标、托盘图标、窗口风格的方法
BOOL DestroyIcon( HICON hIcon );
其中,hIcon用来指定要删除的图标句柄。 3. 图标的显示 图标的显示一般有两种方法:一是通过静态图片控件来显示,或在其他(如按钮) 控件设置显示;二是通过函数CDC::DrawIcon用来将一个图标绘制在指定设备的位置处 (这一方法以后再讨论)。 4. 图标示例 下面来看一个示例,如图5.5所示,单击[开始]按钮,3个图标就会每隔100ms随机显示, 且此时[开始]按钮变成[停止]。单击[停止]按钮,图标停止更新,按钮的名称变成“开 始”,如果3个图标的图案都是一样的,则弹出消息对话框,显示“恭喜你!”,否则 显示“失败!”。
5.2图标
(4)在CMainFrame::OnCreate函数的最后添加计时器设置代码:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; ... SetTimer(1, 500, NULL); return 0; }
其中,lpszResourceName和nIDResource分别表示图标资源的字符串名和标识。函 数返回的是一个图标句柄。 如果不想使用新的图标资源,也可使用系统中预定义好的标准图标,这时需调用 CWinApp::LoadStandardIcon 函数,其原型如下:
HICON LoadStandardIcon( LPCTSTR lpszIconName ) const;
图5.6 添加并设计的图标
5.2图标
(4)在ResourceView页面中,双击“Dialog”下的IDD_EX_RANDICON_DIALOG, 打开对话框资源模板。将对话框的标题设为“图标使用”。删除“TODO: 在这里设置对 话控制。”静态文本控件和[取消]按钮,将[确定]按钮标题改为“退出”。 (5)打开对话框网格,参照图5.5所示,调整对话框大小,分别依次添加3个静态图 片控件,ID号分别设置为IDC_STATIC_1、IDC_STATIC_2和IDC_STATIC_3,类型选择 为“图标”,图像依次选择为IDI_ICON1、IDI_ICON2和IDI_ICON3,在样式属性中,分 别选中“图像居中”。 (6)添加一个按钮控件,ID号为IDC_BUTTON_START,标题为“开始”。 (7)按Ctrl+W键,打开MFC ClassWizard的Member Variables页面,依次为 IDC_STATIC_1、IDC_STATIC_2和IDC_STATIC_3设置CStatic类的Control变量 m_wndIcon1、m_wndIcon2和m_wndIcon3。 (8)切换到Messsage Maps页面,为按钮IDC_BUTTON_START添加 BN_CLICKED消息映射,保留默认的映射函数名,添加下列代码: (9)再次打开MFC ClassWizard的Messsage Maps页面,为CEx_RandIconDlg类 添加WM_TIMER消息映射,并在映射函数中添加下列代码: (10)编译运行并测试。

MFC窗口各控件的颜色和字体的设置

MFC窗口各控件的颜色和字体的设置

MFC窗口各控件的颜色和字体的设置很多人定义了基于MFC的程序项目,当设计界面使用控件时,却不知道如何对各控件进行字体与颜色的设计;其实这些修改是需要动手添加代码的,这方面的修改在控件属性里是没有现成的,这不同于.net定义的项目,它的是有直接属性修改的。

我在原文的基础上做了修改与完善,也可参见原文原文:/visual-studio/vc/74759.htm1、改变对话框的底色在对话框的类中添加一个private : CBrush m_brush;的成员变量。

在类的构造函数中添加如下代码:m_brush.CreateSolidBrush(RGB(0,0,255)); //初始化为蓝色为对话框添加一个WM_CTLCOLOR消息响应函数,专门为控件着色的消息响应函数,代码如下:HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);//return hbr;return m_brush;}当然,.h文件里也要对函数进行预定义的;此时,该对话框的背景色已经全为蓝色了。

2、如果我们要设置某一个对话框控件的底色和文字颜色时只要将上面return m_brush;改为:if (pWnd->GetDlgCtrlID()==IDC_LINE_STYLE){pDC->SetTextColor(RGB(0,255,0));//pDC->SetBkMode(TRANSPARENT);pDC->SetBkColor(RGB(255,0,0));return m_brush;}return hbr;注意如果要设置单行EDIT的文字背景色,需要使用SetBkColor设置,而SetBkMode即使为透明,文字的背景仍为系统的默认色。

MFC窗口位置管理详细分析及实例vc 技术

MFC窗口位置管理详细分析及实例vc  技术

用区域里占据多大一块,最后一个子窗口由于别无选择,所以不需要这样的算法。
当然,初始的可用区域是一个矩形,每次被切割后剩下的可用区域还是一个矩形,不可能是别的形状的。
举例说来,在一个典型单文档程序中,父窗口就是从CFrameWnd派生的主框架窗口,最后一个子窗口就是视图窗口,如果用了CSplitterWnd生成分隔条的话,最后一个子窗口就是拥有分隔条的那个窗口。其它子窗口就是工具栏窗口和状态条窗口,以及可能有的别的控件窗口。
AFX_SIZEPARENTPARAMS layout;
AFX_SIZEPARENTPARAMS结构定义如下:
struct AFX_SIZEPARENTPARAMS
{
HDWP hDWP;
假如我们自己从CWnd类派生一个窗口类并生成一个窗口,在它的客户区里要生成若干个子窗口,我们想使这些子窗口排列得规规矩矩,互不重叠,当父窗口的尺寸变了时各个子窗口能适时调整自己的尺寸和位置,使各个子窗口之间的位置大小比例关系不变。当移动其中一个或几个子窗口时,别的子窗口能及时为这个移动了的子窗口让位。当然我们可以利用api函数里管理窗口的函数来编写自己的管理子窗口的方法。可是如果在父窗口的客户区里有了工具栏,状态条等等子窗口时,你自己加进来的子窗口还能和这些mfc提供的子窗口融洽相处吗?你如何保证你的子窗口不会覆盖了能够四处停靠的工具栏?当工具栏和状态条消失后你的子窗口如何才能知道,以便及时调整自己的大小从而覆盖工具栏和状态条腾出的空间?基于文档视图构架的窗口的客户区内还有个视图,你自己硬加上的子窗口能不和视图窗口争地盘吗?
2。消息WM_SIZEPARENT
每个欲参与分配客户区的子窗口都要响应这个消息,除非这个子窗口是那个特定的子窗口。

MFC之修改单文档窗口标题

MFC之修改单文档窗口标题

MFC之修改单⽂档窗⼝标题/xman/34012.html⾸先我们启动Visual Studio2005,新建项⽬Test利⽤MFC App Wizard ⽣成MFC应⽤程序框架。

程序运⾏后显⽰如下:修改窗⼝标题字符串“⽆标题-Test”<1> 修改前半部分⽅法⼀:更改StringTable的IDR_MAINFRME的标题,将第⼀个\n之和第⼆个\n之间添加字符串fan为:Test\nfan\nTest\n\n\nTest.Document\nTest.Document⽅法⼆:在 CEX041Doc::OnNewDocument()中添加SetTitle("我的程序");BOOL CTestDoc::OnNewDocument(){if (!CDocument::OnNewDocument())return FALSE;// TODO: 在此添加重新初始化代码SetTitle(L"fan");// (SDI ⽂档将重⽤该⽂档)return TRUE;}⽅法三:重载虚函数SetTitlevoid CTestDoc::SetTitle(LPCTSTR lpszTitle){// TODO: 在此添加专⽤代码和/或调⽤基类CDocument::SetTitle(L"fan");}运⾏结果如下:<2>修改后半部分修改StringTable的IDR_MAINFRME的标题,将第⼀个\n之前的字符串Test替换为XJTU:XJTU\nfan\nEX041\n\n\nEX041.Document\nEX041.Document运⾏结果如下:<3>去掉标题中间的“-”⽅法⼀:可以通过利⽤CWnd::SetWindowText即:void SetWindowText( LPCTSTR lpszString );在C EX041App::InitInstance()中调⽤如下语句m_pMainWnd->SetWindowText(L"XJTU");或在其他地⽅⽤(AfxGetMainWnd())->SetWindowText(L"XJTU");也可以得到相同的结果。

MFC中自定义窗口类名技巧

MFC中自定义窗口类名技巧

转载MFC中封装很多常用的控件,把类名也给封装了,没有提供明显的接口出来,用win api 写窗口程序,第一步就是注册窗口类此时类名和标题名是一起注册的,所以能把标题很好地让用户来设定,类名也应该是很简单的,可惜的是MFC没有这样做,原因也许是window name可以不停的改,而类名不能。

窗口的类名是有Create来确定的,要在Create前,给窗口选择一个已经注册的窗口类名,作为参数窗口Create就ok了,CWnd的Create最终还是到了CreateEx中来,看看CreateEx 就会清楚许多BOOL CWnd::CreateEx(DWord dwExStyle, LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, LPVOID lpParam /* = NULL */){ return CreateEx(dwExStyle, lpszClassName, lpszWindowName, dwStyle, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, pParentWnd->GetSafeHwnd(), (HMENU)(UINT_PTR)nID, lpParam);}BOOL CWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam){ ASSERT(lpszClassName == NULL || AfxIsValidString(lpszClassName)|| AfxIsValidAtom(lpszClassName)); ENSURE_ARG(lpszWindowName == NULL || AfxIsValidString(lpszWindowName)); // allow modification of several common create parameters CREA TESTRUCT cs; cs.dwExStyle = dwExStyle; cs.lpszClass = lpszClassName; cs.lpszName = lpszWindowName; cs.style = dwStyle; cs.x = x; cs.y = y; cs.cx = nWidth; cs.cy = nHeight; cs.hwndParent = hWndParent; cs.hMenu = nIDorHMenu; cs.hInstance = AfxGetInstanceHandle(); cs.lpCreateParams = lpParam; if (!PReCreateWindow(cs)) { PostNcDestroy(); returnFALSE; } AfxHookWindowCreate(this); HWND hWnd = ::AfxCtxCreateWindowEx(cs.dwExStyle, cs.lpszClass, cs.lpszName, cs.style, cs.x, cs.y, cs.cx, cs.cy, cs.hwndParent, cs.hMenu, cs.hInstance, cs.lpCreateParams);#ifdef _DEBUG if (hWnd == NULL) { TRACE(traceAppMsg, 0, "Warning: Window creation failed: GetLastError returns 0x%8.8Xn", GetLastError()); }#endif if (!AfxUnhookWindowCreate()) PostNcDestroy(); // cleanup if CreateWindowEx fails too soon if (hWnd == NULL) return FALSE; ASSERT(hWnd == m_hWnd); // should have been set in send msg hook return TRUE;}可以看到最后到了::AfxCtxCreateWindowEx,可以很容易地知道这里调用了CreateWindowEx 来创建一个窗口在前面有一个PreCreateWindow(cs),而cs经过PreCreateWindow处理后,交给::AfxCtxCreateWindowEx处理::AfxCtxCreateWindowEx在中转给CreateWindowEx,cs.lpszClass就是类名,可以清楚了AfxCtxCreateWindowEx的用心良苦我们可以重载的PreCreateWindow,来修改类名,如下的代码:// TODO: 在此添加专用代码和/或调用基类//VERIFY(AfxDeferRegisterClass(AFX_WND_REG)); //AfxEndDeferRegisterClass(AF X_WND_REG); //cs.lpszClass = AfxRegisterWndClass(NULL); WNDCLASS wndcls; memset(&wndcls, 0, sizeof(WNDCLASS)); // start with NULL // defaults wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW; //you can specify your own window procedure wndcls.lpfnWndProc = ::DefWindowProc; wndcls.hInstance = AfxGetInstanceHandle(); wndcls.hIcon = NULL; // or load a different icon wndcls.hCursor =NULL; wndcls.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); wndcls.lpszMenuName = NULL; // Specify your own class name for using FindWindow later wndcls.lpszClassName = _T("MyNewClass"); // Register the new class and exit if it fails if(!AfxRegisterClass(&wndcls)) { TRACE("Class Registration Failedn"); return FALSE; } cs.lpszClass = wndcls.lpszClassName; return TRUE; //return CWnd::PreCreateWindow(cs);其实就是为了把一个已经注册的类名字符串传给CreateWindowEx,从上面代码中的注释中来看,我还用了一种让系统来生成className的方法AfxRegisterWndClass。

mfc的setwindowlong函数 -回复

mfc的setwindowlong函数 -回复

mfc的setwindowlong函数-回复mfc的SetWindowLong函数是一种非常常用的函数,它用于设置窗口的特定属性。

该函数在Windows操作系统中的MFC(Microsoft Foundation Class)框架中提供,它可以对窗口进行广泛的自定义和调整。

本文将一步一步地回答关于这个函数的问题,并详细介绍其使用和功能。

下面我们来回答一些关于mfc的SetWindowLong函数的常见问题:1. SetWindowLong函数是用来做什么的?SetWindowLong函数用于设置指定窗口的扩展风格或者用户数据,以便进行自定义操作。

它可以改变窗口的外观、行为和特性。

2. SetWindowLong函数的参数有哪些?SetWindowLong函数的参数包括hWnd 、nIndex 、dwNewLong 。

其中hWnd 是指明具体要设置的窗口的句柄;nIndex 是一个可以指定特定属性的常量;dwNewLong 是要设置的新属性值。

3. SetWindowLong函数可以设置哪些属性?SetWindowLong函数可以设置的属性包括窗口的扩展风格、用户数据、窗口过程等。

通过设置不同的属性,我们可以自定义窗口的各种行为和特性。

4. SetWindowLong函数如何使用?首先,我们需要获取要进行设置的窗口的句柄。

然后,我们使用SetWindowLong 函数来设置窗口的属性。

具体使用方法如下:HWND hWnd = GetMyWindowHandle();LONG_PTR newValue = GenerateNewValue();LONG_PTR previousValue = SetWindowLong(hWnd,GWL_STYLE, newValue);在这个例子中,我们使用GetMyWindowHandle 函数获取窗口的句柄,然后使用GenerateNewValue 函数生成要设置的新的属性值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

mfc修改主窗口风格和窗口类
AppWizard生成的应用程序框架的主窗口具有缺省的窗口风格,比如在窗口标题条中自动添加文档名、窗口是叠加型的、可改变窗口大小等。

要修改窗口的缺省风格,需要重载
CWnd::PreCreateWindow(CREATESTRUCT& cs)函数,并在其中修改CREATESTRUCT型参数cs。

CWnd::PreCreateWindow 函数先于窗口创建函数执行。

如果该函数被重载,则窗口创建函数将使用CWnd::PreCreateWindow 函数返回的CREATESTRUCT cs参数所定义的窗口风格来创建窗口;否则使用预定义的窗口风格。

CREATESTRUCT结构定义了创建函数创建窗口所用的初始参数,其定义如下:
typedef struct tagCREATESTRUCT {
LPVOID lpCreateParams; // 创建窗口的基本参数
HANDLE hInstance; // 拥有将创建的窗口的模块实例句柄
HMENU hMenu; // 新窗口的菜单句柄
HWND hwndParent; // 新窗口的父窗口句柄
int cy; // 新窗口的高度
int cx; // 新窗口的宽度
int y; // 新窗口的左上角Y坐标
int x; // 新窗口的左上角X坐标
LONG style; // 新窗口的风格
LPCSTR lpszName; // 新窗口的名称
LPCSTR lpszClass; // 新窗口的窗口类名
DWORD dwExStyle; // 新窗口的扩展参数
} CREATESTRUCT;
CREATESTRUCT结构的style域定义了窗口的风格。

比如,缺省的MDI主窗口的风格中就包括FWS_ADDTOTITLE(在标题条中显示当前的工作文档名)、FWS_PREFIXTITLE(把文档名放在程序标题的前面)、WS_THICKFRAME(窗口具有可缩放的边框)等风格。

由于多种风格参数由逻辑或(“|”)组合在一起的,因此添加某种风格,就只需用“|”把对应的参数加到CREATESTRUCT结构的style域中;删除已有的风格,则需用“&”连接CREATESTRUCT结构的style域与该风格的逻辑非值。

CREATESTRUCT结构的x、y、cx、cy域分别定义了窗口的初始位置和大小,因此,在
CWnd::PreCreateWindow 函数中给它们赋值,将能定义窗口的初始显示位置和大小。

下例中的代码将主框窗口的大小将固定为1/4屏幕,标题条中仅显示窗口名,不显示文档名。

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs
// 修改主窗风格
cs.style &= ~FWS_ADDTOTITLE; //去除标题条中的文档名
cs.style &= ~WS_THICKFRAME; //去除可改变大小的边框
cs.style |= WS_DLGFRAME; //增加不能改变大小的边框
// 确定主窗的大小和初始位置。

int cxScreen = ::GetSystemMetrics(SM_CXSCREEN);//获得屏幕宽
int cyScreen = ::GetSystemMetrics(SM_CYSCREEN); //获得屏幕高
cs.x = 0; // 主窗位于左上角
cs.y = 0;
cs.cx = cxScreen/2; // 主窗宽为1/2屏幕宽
cs.cy = cxScreen/2; // 主窗高为1/2屏幕高
return CMDIFrameWnd::PreCreateWindow(cs);
}
修改窗口类,实现更改背景颜色
方法一:
BOOL CMainWindow::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此添加专用代码和/或调用基类
if( CFrameWnd::PreCreateWindow(cs))
{
//改变窗口类
WNDCLASS wndclass;
::GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wndclass); //wndclass.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1); //wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); wndclass.hbrBackground=CreateSolidBrush(RGB(0,100,100)); wndclass.hbrBackground=m_BKBrush;//m_BKBrush不能为函数局部变量wndclass.hbrBackground=*(new CBrush(RGB(25,25,0)));//最方便的方法//wndclass.hCursor = AfxGetApp()-> LoadCursor(IDC_CURSOR1); wndclass.lpszClassName = _T("newViewClassName ");
VERIFY(AfxRegisterClass(&wndclass));
cs.lpszClass=wndclass.lpszClassName;
return TRUE;
}
return FALSE;
}
方法二:
BOOL CMFC_单文档View::PreCreateWindow(CREATESTRUCT& cs)
{
WNDCLASS wndclass;
//1.调用基类的同名函数,以自动生成一个窗口类供修改
CView::PreCreateWindow(cs);
//2.得到窗口类
::GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wndclass); //3.修改窗口类
wndclass.hbrBackground=CreateSolidBrush(RGB(0,100,100)); OutputDebugString(wndclass.lpszClassName);
//4.更新窗口类
//反注册MFC自动生成的窗口类(因为新旧窗口类名称一样)
::UnregisterClass(cs.lpszClass,AfxGetInstanceHandle());
//注册修改后的窗口类
AfxRegisterClass(&wndclass);
//因为新旧窗口类名称一样,不必执行下面这句代码
//cs.lpszClass=wndclass.lpszClassName;
//注意返回TRUE
return TRUE; 澳门新濠天地官网
}。

相关文档
最新文档