2023年12月17日发(作者:)

窗口

让窗口一启动就最大化

把应用程序类〔CxxxApp〕的 InitInstance() 函数中的

m_pMainWnd->ShowWindow(SW_SHOW); 改为

m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);

那么窗口一启动就最大化显示。

显示位置的设置方法

GetWindowRect() 得到的是在屏幕坐标系下的RECT〔即以屏幕左上角为原点〕

GetClientRect() 得到的是在客户区坐标系下的RECT〔即以所在窗口左上角为原点,去掉了标题栏计算,仅仅是个大小,返回值的左上角永远为0,0〕

ScreenToClient() 就是把屏幕坐标系下的RECT坐标转换为客户区坐标系下的RECT坐标。

如果需要获得窗体在屏幕上的位置,使用GetWindowRect

如果需要获得窗体的大小,使用GetClientRect

如何设置窗口的初始尺寸

在将应用程序类〔CxxAPP〕的 InitInstance() 函数中参加:

m_pMainWnd->SetWindowPos(NULL,x,y,Width,Height,SWP_NOMOVE);

Width为窗口宽度,Height为窗口高度

SWP_NOMOVE表示忽略位置(x,y)。

如:

让窗口居中显示

以下两种方法可任选其一:

①在应用程序类〔CxxxApp〕的 InitInstance() 函数中参加:

②在主框架类()的OnCreate()函数中参加:

CenterWindow( GetDesktopWindow() );

如:如何修改窗口标题

窗口标题一般形式为:文档标题 - 程序标题

1、设置文档标题:

在文档类(CxxxDoc)的OnNewDocument()函数中参加语句:SetTitle("文档名");

如::①可删除Debug文件夹和Release文件夹;

②原那么上还可删除主文件夹中所有图标为 的文件,包括.aps、.ncb、.opt、.plg等文件,它们都能在编译时重建。但一般.clw不要删除,它可能导致ClassWizard不好用。

控件

如何隐藏和显示控件

用CWnd类的函数BOOL ShowWindow(int nCmdShow)可以隐藏或显示一个控件。

例1:

CWnd *pWnd;

pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT为控件ID号

pWnd->ShowWindow( SW_HIDE ); //隐藏控件

例2:

CWnd *pWnd;

pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT为控件ID号

pWnd->ShowWindow( SW_SHOW ); //显示控件

按钮的使能与禁止

用ClassWizard的Member Variables为按钮定义变量,如:m_Button1;

那么

m_Window(true); 使按钮处于允许状态

m_Window(false); 使按钮被禁止,并变灰显示

改变控件的大小和位置

用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置。

void MoveWindow(int x,int y,int nWidth,int nHeight);

void MoveWindow(LPCRECT lpRect);

第一种用法需给出控件新的坐标和宽度、高度;

第二种用法给出存放位置的CRect对象;

例:

CWnd *pWnd;

pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT1为控件ID号

pWnd->MoveWindow( CRect(0,0,100,100) ); //在窗口左上角显示一个宽100、高100的编辑控件

SetWindowPos()函数使用更灵活,多用于只修改控件位置而大小不变或只修改大小而位置不变的情况:

BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);

第一个参数一般设为NULL;

x、y控件位置;cx、cy控件宽度和高度;

nFlags常用取值:

SWP_NOZORDER:忽略第一个参数;

SWP_NOMOVE:忽略x、y,维持位置不变;

SWP_NOSIZE:忽略cx、cy,维持大小不变;

例:

CWnd *pWnd;

pWnd = GetDlgItem( IDC_BUTTON1 ); //获取控件指针,IDC_BUTTON1为控件ID号

pWnd->SetWindowPos( NULL,50,80,0,0,SWP_NOZORDER | SWP_NOSIZE ); //把按钮移到窗口的(50,80)处

pWnd = GetDlgItem( IDC_EDIT1 );

pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER | SWP_NOMOVE ); //把编辑控件的大小设为(100,80),位置不变

pWnd = GetDlgItem( IDC_EDIT1 );

pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER ); //编辑控件的大小和位置都改变

以上方法也适用于各种窗口。

单项选择按钮控件〔Radio Button〕的使用

一、对单项选择按钮进行分组:

每组的第一个单项选择按钮设置属性:Group,Tabstop,Auto;其余按钮设置属性Tabstop,Auto。

如:

Radio1、Radio2、Radio3为一组,Radio4、Radio5为一组

设定Radio1属性:Group,Tabstop,Auto

设定Radio2属性:Tabstop,Auto

设定Radio3属性:Tabstop,Auto

设定Radio4属性:Group,Tabstop,Auto

设定Radio5属性:Tabstop,Auto

二、用ClassWizard为单项选择控件定义变量,每组只能定义一个。如:m_Radio1、m_Radio4。

三、用ClassWizard生成各单项选择按钮的单击消息函数,并参加内容:

void CWEditView::OnRadio1()

{

m_Radio1 = 0; //第一个单项选择按钮被选中

}

void CWEditView::OnRadio2()

{

m_Radio1 = 1; //第二个单项选择按钮被选中

}

void CWEditView::OnRadio3()

{

m_Radio1 = 2; //第三个单项选择按钮被选中

}

void CWEditView::OnRadio4()

{

m_Radio4 = 0; //第四个单项选择按钮被选中

}

void CWEditView::OnRadio5()

{

m_Radio4 = 1; //第五个单项选择按钮被选中

}

当控件变量值为0时,它对应组的第一个单项选择按钮处于选中状态。

BOOL CDzyApp::InitInstance()

{

AfxEnableControlContainer();

……

// The one and only window has been initialized, so show and update it.

m_pMainWnd->SetWindowPos(NULL,0,0,750,555,SWP_NOMOVE);//设置窗口的初始大小为750*555

m_pMainWnd->ShowWindow(SW_SHOW);

m_pMainWnd->UpdateWindow();

return TRUE;

}

m_pMainWnd->CenterWindow( GetDesktopWindow() );

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {

if (CFrameWnd::OnCreate(lpCreateStruct) == -1)

return -1;

……

// TODO: Delete these three lines if you don't want the toolbar to

// be dockable

m_Docking(CBRS_ALIGN_ANY);

EnableDocking(CBRS_ALIGN_ANY);

DockControlBar(&m_wndToolBar);

CenterWindow( GetDesktopWindow() ); //使窗口翻开时处于屏幕正中

return 0;

}

BOOL CTextEditorDoc::OnNewDocument() {

if (!CDocument::OnNewDocument())

return FALSE;

// TODO: add reinitialization code here

// (SDI documents will reuse this document)

SetTitle("未命名.txt"); //设置文档标题

return TRUE;

}

2、设置程序标题:

在框架类(CMainFrame)的PreCreateWindow()函数中参加语句:m_strTitle = _T("程序标题");

如::

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {

if( !CFrameWnd::PreCreateWindow(cs) )

return FALSE;

// TODO: Modify the Window class or styles here by modifying

// the CREATESTRUCT cs

&=~FWS_ADDTOTITLE;//去除标题栏文字前面的"无标题"

m_strTitle = _T("文本整理器"); //设置程序标题

return TRUE;

}

以上两点比拟适用于视图-文档结构的程序,在新建文档时,系统会自动运行OnNewDocument()函数,在其中可以设置适宜的标题。对于未采用文档的程序可以用下面的方法修改标题:

3、修改窗口标题:

修改窗口标题一般在翻开文件函数OnFileOpen()和另存为函数OnFileSaveAs()中进行,可以使用下面的函数:其中文档标题和程序标题可使用定义过的串变量。

工程

如何干净的删除一个类?

1、先删除工程中对应的.h和.cpp文件,〔选中后用Delete键删除〕

2、保存后退出工程,到文件夹中删除实际的.h和.cpp文件;

3、删除.clw文件;

4、重新进入工程,进行全部重建〔rebuild all〕。

如何建立一个新类?

从“插入〞(Insert)菜单中选择“新建类〞(New Class),在弹出的对话框中选择基类(Base

class),在Name中输入新类的名字〔一般都以C开头〕即可。

如果想要建立一个没有基类的自定义类,那么在New Class对话框中把Class type设置为generic,再输入类名即可。

如何把外来文件添加到工程中?

先把外来文件复制到当前工程的目录下,从“工程〞(Project)菜单下选择“添加工程〞(Add to

Project)下的“Files〞菜单项,从弹出的翻开文件对话框中把外来文件翻开即可。

如何在一个工作区中翻开多个工程?

一般编程者都有这样的经历:做了一个工程,由于不满意,想从头重做,但又想把旧工程的一些可用内容拷到新工程中来,以免做重复工作,这时就需要在新工程中翻开旧工程。

先翻开新工程,从“工程〞(Project)菜单下选择“插入工程到工作区〞(Insert Project into

Workspace),从弹出的翻开文件对话框中翻开旧工程的.asp文件即可。

之后,可以利用“工程〞(Project)菜单下的“设置活动工程〞(Select Active Project)的选项中切换各翻开的工程。

注意:在一个工作区中翻开的各工程不能同名。

如何把工程中的文件分类存放?

当我们往工程中添加新类时,它会把源文件放在Source Files下,头文件放在Header Files下。当工程中文件很多时,管理不便,最好添加新节点,把文件分类放置。

右击工程节点树的根节点,选择“〞,在弹出的对话框中填入新节点名,那么新节点就建立了,用鼠标节点树中的文件拖入新节点,就可以把文件分类了。

以上分类只是在工程的节点树中分类,它不影响文件在磁盘上的位置,所有.cpp文件和.h文件仍在工程的根目录下,最好文件本身也能分类存放在不同文件夹中。

在Windows下,用“新建文件夹〞在工程的根目录下建立子文件夹,如DialogClass,把所有对话框类的.cpp文件和.h文件拖入其中。

回到VC下,右键单击工程树中更改了路径的节点,选择“Properties〞,在弹出的对话框中修改文件路径,如:把原路径“.〞改为“.〞。

翻开文件,修改它包含的文件路径。如:

#include "stdafx.h"

#include "PluckBox.h"

#include "Dialog1.h"

改为:

#include "stdafx.h"

#include "..PluckBox.h"

#include "Dialog1.h"

翻开ClassWizard,它会提示你文件不存在,单击“确定〞后,从对话框中用“〞选择文件所在路径,那么ClassWizard也可正常使用了。

编辑

编辑代码时,跟随提示消失了怎么办?

单 击“工具〞(Tools)菜单中的“设置〞(Options)菜单项,在弹出的Options对话框中选择Editor制表页,把它最下方的四个复选框都 选中〔Auto list member、Auto type info、Code comments、Auto parameter info〕,这样,当用户输入“->〞或“.〞时,会自动显示跟随提示,减少了输入负担。

对话框

如何修改对话框的背景色

在对话框的OnPaint()函数中参加下面语句:

CRect rect;

GetClientRect(&rect); //计算对话框的尺寸

lidRect(&rect,RGB(192,248,202)); //绘制对话框背景色

如何让弹出式对话框具有统一的背景色

在应用程序类CxxxApp的InitInstance()函数中参加下面的语句:

SetDialogBkColor( RGB(192,248,202) );

那么所有用户定义的弹出式对话框都以RGB(192,248,202)为背景色,就不需要逐个进行设置了。

如何让翻开文件对话框能进行多项选择

在定制翻开文件对话框时,增加OFN_ALLOWMULTISELECT属性,就可以使翻开文件对话框进行多项选择了。

如:

CFileDialog m_Dlg( TRUE, NULL, NULL, OFN_HIDEREADONLY |

OFN_OVERWRITEPROMPT

| OFN_ALLOWMULTISELECT, NULL, NULL );

之后,用GetStartPosition()函数获取选择的起始文件位置,用GetNextPathName()函数获取各位置上的文件名。

如:

if( m_l() == IDOK )

{

POSITION pos;

pos = m_rtPosition();

while( pos )

{

m_Path = m_tPathName(pos);

…………

}

}

为什么用翻开文件对话框选择多个文件到一定数目时,文件没有翻开?

CFileDialog为文件列表设置有缓冲区,中选择文件过多时,会造成缓冲区溢出,造成一些文件没有被翻开。可以采用自定义大缓冲区代替系统缓冲区的方法解决。

如:

CFileDialog m_Dlg( TRUE, NULL, NULL, OFN_HIDEREADONLY |

OFN_OVERWRITEPROMPT

| OFN_ALLOWMULTISELECT, NULL, NULL );//定制翻开文件对话框

char* pBuf = new char[20480]; //申请缓冲区

m_Dlg.m_le = 20480; //让pBuf代替CFileDialog缓冲区

m_Dlg.m_ile = pBuf;

m_Dlg.m_ile[0] = NULL;

…………

delete []pBuf; //回收缓冲区