VC常用技巧

(1)为什么某个类突然在工作区间里面突然看不见了?

只是类隐藏了,打开FILEVIEW,找到隐藏类的头文件,随便敲一下键盘的空格键,类就会在CLASSVIEW中显示了

(2)在基于对话框的程序中,一按回车键,对话框就没了。

把确定按纽的缺省属性前面的对勾去掉,重载OnOk()函数,在OnOk()函数里注释掉调用基类的OnOk()函数那行代码

(3) 为什么我的VC6.0自动显示成员列表功能时有时无?

删除该项目扩展名为.ncb文件,重新打开该项目。

(4)如何干净的删除一个类?

先从workspace中的fileview中删除对应的.h和.cpp文件;再关闭项目,从实际的文件夹中删除对应的.h和.cpp文件;再删除.clw文件。 最后打开项目,rebuild all。

(5)网络程序只能在debug运行,release不行,提示错误 error LNK2001: unresolved external symbol __imp__WSAStartup

在Release下仍然需要添加Ws2_32.lib。

(6)在安装VC时未安装MSDN, 自己再用MSDN安装盘安装后在VC中按F1无法调用?

修改注册表是最直接的方法,具体过程如下: 在HKEY_CURRENT_USER/Software/Microsoft/DevStudio/6.0/Help下增加Enable,Filename,State三个主键,注意其类型,含义如下:  Enable 类型:DWORD,默认值是1,改变为0x00000001  Filename 类型:字符串改为c:/program files/..../MSDev98/help/Msdev.hlp  State 类型:DWORD 默认值为0,改变为0x00000001

(7)复制了一段代码到当前工作空间里,可是代码排列很乱,如何调整?

简单,按下鼠标左键拖动鼠标将代码选择上,同时按下键盘的ALT+F8键

(8)如何建立多文档?
为了加入对附加文档类型的支持,你可以在CWinApp派生类中创建和注册附加CmultiDocTemplate对象。。将一个附加文档类型加入到MFC程序的一般步骤如下:
用AppWizard来创建一个新的文档类和视图类。
用资源编辑器增加新的资源字串来支持新的文档类。要想知道关于文档样板字符串格式的更多内容,请参阅"如何理解文档样板字符串"。
用资源编辑器增加附加的应用程序图标和菜单资源。注意,这些资源中每一个的ID都必须与在步骤2中创建的文档模板字符串的ID是相同的。这个ID被CmultiDocTemplate类用来识别与附加文档类型相关的资源。
在应用程序的InitInstance()函数中,创建了另一个CMultiDocTemplate对象并且用CWinApp::AddDocTemplate()函数来注册。例如:

CMultiDocTemplate* pDocTemplate2 = new CMultiDocTemplate(
  IDR_DOC2TYPE, RUNTIME_CLASS(CDoc2),
  RUNTIME_CLASS(CMDIChildWnd),RUNTIME_CLASS(CView2));
  AddDocTemplate(pDocTemplate2);

最后,将定制的序列化和绘图代码加入到你的新文档和视图类中。

(9)如何使我的程序在启动时不创建一个新文档?
在程序的InitInstance中的ProcessShellCommand函数之前加入: cmdInfo.m_nShellCommand = CCommandLineInf:FileNothing

(10) 如何获取应用程序的实例句柄?
应用程序的实例句柄保存在CWinApp m_hInstance 中,可以这么调用AfxGetInstanceHandle获得句柄.

(11)如何得到程序中其它类的指针(例如框架类,视类,文档类等等)?

MFC应用程序中指针的使用 (转)

(12)获得各种目录信息
Windows目录: Use "GetWindowsDirectory"
Windows下的system目录: Use "GetSystemDirectory"
temp目录: Use "GetTempPath"
当前目录: Use "GetCurrentDirectory"

(13)如果让控制台应用程序支持MFC类库?
    可以在控制台应用程序中include 来引入mfc库,但是控制台应用程序缺省是单线程的,mfc是多线程的,为解决该矛盾,在project setting->c/c++ 选项,选择code generation,在use run-time library 下拉框中选择debug multithread。

(14) 我怎样才能在我的应用程序中循环浏览已经打开的文档?

使用CDocTemplate中未公开的GetFirstDocPosition()和GetNextDoc()函数。

(15)怎样才能在我的应用程序中循环浏览已经打开的视?

使 用 CDocument 中 未 公 开 的 GetFirstViewPosition() 和 GetNextView() 函 数。

(16)PreCreateWindow是干什么用的?

PreCreateWindow 允许你在调用CreateWindow之前来改变窗口属性。

(17)该怎样防止MFC在窗口标题栏上把文档名预置成应用程序名?

在 PreCreateWindow 函数中删除 FWS_PREFIXTITLE 标志的窗口样式:
    cs.style &= ~FWS_PREFIXTITLE;

(18) 我应该怎样防止MFC在窗口标题栏上添加文档名?

在 PreCreateWindow 函数中删除 FWS_ADDTOTITLE 标志的窗口样式:
    cs.style &= ~FWS_ADDTOTITLE ;

(19) 我应该如何改变视窗口的大小?

因为视窗口实际上是框架窗口的子窗口,所以你必须改变框架窗口的大小,而不是改变视窗口。使用CView类中的GetParent() 函数获得指向框架窗口的指针,然后调用 MoveWindow() 函数来改变框架的大小。这会使变尺寸的视充满框架窗口。

(20) 我有一无模式对话框。我怎样才能在窗口退出时删除CDialog对象?

把“delete this”加到 PostNcDestroy 中。这主要用在需要自动删除对象的场合。

(21) 为什么把“delete this”放在PostNcDestroy中而不是OnNcDestroy?

OnNcDestroy 只被已建立的窗口调用。如果建立窗口失败 ( 如 PreCreateWindow ),则没有窗口处来发送 WM_NCDESTROY 消息。PostNcDestroy 是在对象窗口被完全删除,在 OnNcDestroy 后,甚至在窗口建立失败之后调用的。

(22):怎么才能让窗口最大化显示啊?

要使窗口最大化显示,应改变ShowWindow()的参数.
在InitInstance()中将
m_pMainWnd->ShowWindow(...)改为
m_pMainWnd->ShowWindow(SW_SHOWMAXINIZE);就Ok

(23)怎么把别人程序中设计好的对话框放到自己的程序中??

用VC打开自己的程序,选择资源视图;然后点FILE->OPEN菜单项,打开设计好的对话框的资源文件(后缀名为。RC),这里注意一定只打开后缀名为。RC的资源文件,然后在VC编辑器的文档区域就会有你刚打开的另一个程序的资源文件中资源的一个树型结构图,然后找到你要复制的对话框资源ID,鼠标左键按住ID号,然后拖放到资源视图中,这个时候你再看看自己程序的资源视图,是不是已经复制过来了。罗嗦了这么多,其实问题的关键是在一个编辑器中同时打开自己的项目和另一个项目的资源文件。

(24)关于installshield制作中的注册表问题: 怎样在注册表中写入用户单位的名称

在InstallShield选择Resources,在其中的Registry Entry部分输入要添加的注册项 。

(25)简介对话框应用程序中UpdateData函数的作用及其参数含义与使用场合。
  UpdateData只有一个BOOL类型的参数,UpdateData(FALSE)一般用于对话框控件连接的变量值刷新屏幕显示;UpdateData(TRUE)用于获取屏幕数据到对话框控件连接的变量中。

(26)如何单击除了窗口标题栏以外的区域使窗口移动

当窗口需要确定鼠标位置时Windows向窗口发送WM_NCHITTEST信息,可以处理 该信息使Windows认为鼠标在窗口标题上。对于对话框和基于对话的应用程序,可 以使用ClassWizard处理该信息并调用基类函数,如果函数返回HTCLIENT 则表明 鼠标在客房区域,返回HTCAPTION表明鼠标在Windows的标题栏中。

UINT CSampleDialog : : OnNcHitTest (Cpoint point)
{
    UINT nHitTest =Cdialog: : OnNcHitTest (point );
    return (nHitTest = =HTCLIENT)? HTCAPTION : nHitTest ;
}

上述技术有两点不利之处,其一是在窗口的客户区域双击时, 窗口将极大; 其二,它不适合包含几个视窗的主框窗口。还有一种方法,当用户按下鼠标左键 使主框窗口认为鼠标在其窗口标题上,使用ClassWizard在视窗中处理WM_LBUTTODOWN 信息并向主框窗口发送一个WM_NCLBUTTONDOWN信息和一个单击测试HTCAPTION。

void CSampleView : : OnLButtonDown (UINT nFlags , Cpoint point)
{
    CView::OnLButtonDow (nFlags, pont);
    //Fool window into thinking somene clicked on its caption bar .
    GetParent() —> PostMessage (WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(poitn.x, point.y));
}

该技术也适用于对话框和基于对的应用程序,只是不必调用CWnd : : GetParent 。

void CSampleDialog::OnLbuttonDown(UINT nFlags, Cpoint point)
{
    Cdialog::OnLButtonDow(nFlags, goint ); //Fool dialog into thinking simeone clicked on its caption bar .
    PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARM(point.x, point. y))
}

(27)VC中怎样Copy当前程序到启动目录

BOOL DataManageDlg::CopyFiles(CString sForm, CString sTo)拷贝函数
{
    BOOL isb;
    SHFILEOPSTRUCT fo;
    TCHAR szFrom[MAX_PATH+1];
    TCHAR szTo[MAX_PATH+1];
    ZeroMemory(&fo, sizeof(fo));
    ZeroMemory(szFrom, sizeof(szFrom));
    ZeroMemory(szTo, sizeof(szTo));
    // CString strPath;
    isb=false;
    CString str1;
    // strPath = _T("D://vcvc//ado10//Debug//");
    // strPath += _T("1.txt");
    _tcscpy(szFrom, sForm);
    _tcscpy(szTo, sTo);
    fo.hwnd=this->m_hWnd;
    fo.wFunc = FO_COPY;
    fo.pFrom = szFrom;
    fo.pTo = szTo;
    // fo.fFlags = FOF_SIMPLEPROGRESS;
    // fo.fFlags = FOF_ALLOWUNDO;
    fo.fFlags=FOF_NOCONFIRMATION;
    ::SHFileOperation(&fo);
    isb=true; return isb;
}
启动路径C:/Documents and Settings/All Users/「开始」菜单/程序/启动
///
//CreateShortcut("c://windows//notepad.exe", //快捷方式指向的应用程序
//"c://config.sys", //命令行参数
//"c://windows", //起始位置(工作目录)
//"c://windows//desktop//记事本.lnk", //快捷方式的文件名(包含路径) //"记事本"); //快捷方式的描述
HRESULT CreateShortcut(LPCSTR pszPathObj,LPSTR pszParam,LPSTR pszPath,LPSTR pszPathLink,LPSTR pszDesc)
{
    HRESULT hres; //调用 COM 接口方法之后的返回值
    IShellLink *pShellLink;
    IPersistFile *pPersistFile;
    WCHAR wsz[MAX_PATH]; //UNICODE串, 用来存放快捷方式文件名
    CoInitialize(NULL); //初始化 COM 库
    //创建 COM 对象并获取其实现的接口
    hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,IID_IShellLink,(void **)&pShellLink);
    if(FAILED(hres))
    {
        pShellLink ->Release(); //释放 IShellLink 接口
        CoUninitialize(); //关闭 COM 库, 释放所有 COM 资源
        return FALSE;
    }
    //设置快捷方式的各种属性
    pShellLink->SetPath(pszPathObj); //快捷方式所指的应用程序名
    pShellLink->SetArguments(pszParam); //参数
    pShellLink->SetDescription(pszDesc); //描述
    pShellLink->SetWorkingDirectory(pszPath); //设置工作目录
    //pShellLink->SetIconLocation("C://Icon.ico",0); //快捷方式的图标
    //pShellLink->SetHotkey(热键); //启动快捷方式的热键(只能是Ctrl+Alt+_)
    //pShellLink->SetShowCmd(SW_MAXIMIZE); //运行方式(常规窗口,最大化,最小化)
    //查询 IShellLink 接口从而得到 IPersistFile 接口来保存快捷方式
    hres = pShellLink->QueryInterface(IID_IPersistFile,(void **)&pPersistFile);
    if(FAILED(hres))
    {
        pPersistFile ->Release(); //释放 IPersistFile 接口
        pShellLink ->Release(); //释放 IShellLink 接口
        CoUninitialize(); //关闭 COM 库, 释放所有 COM 资源
        return(FALSE);    
    }
    //转换 ANSI 串为 UNICODE 串(COM 内部使用 NUICODE)
    MultiByteToWideChar(CP_ACP, 0, pszPathLink, -1, wsz, MAX_PATH);
    //使用 IPersistFile 接口的 Save() 方法保存快捷方式
    hres = pPersistFile ->Save(wsz, TRUE);
    //释放 IPersistFile 接口
    pPersistFile ->Release();
    //释放 IShellLink 接口
    pShellLink ->Release();
    //关闭 COM 库, 释放所有 COM 资源
    CoUninitialize();
    return(hres);
}

(28)怎样获取当前程序(EXE)所在的路径

TCHAR szFilePath[MAX_PATH + 1];
GetModuleFileName(NULL, szFilePath, MAX_PATH);
(_tcsrchr(szFilePath, _T('//')))[1] = 0;   //删除文件名,只获得路径 字串9
CString str_url =  szFilePath;

1:获取应用程序自身完整路径文件名
方法1:

#include "stdlib.h"
void main()
{
    cout << _pgmptr << endl;
}

方法2:

char szFullPath[MAX_PATH];
ZeroMemory(szFullPath,MAX_PATH);
::GetModuleFileName(NULL,szFullPath,MAX_PATH);
::MessageBox(NULL,szFullPath,"path",MB_ICONINFORMATION);

2:如何获取应用程序所在目录?

这里值得注意的是很多人都用GetCurrentDirectory(MAX_PATH, szCurrentPath);来获取。这个方法并不好,经常出错,比如现在我有一个程序在d:/test目录下,现在运行这个程序后用GetCurrentDirectory得到的是d:/test。接着在程序里用CFileDialog来打开一个C:/test/test.txt文件后再调用GetCurrentDirectory,那么得到的szCurrentPath就是C:/test而不是d:/test。

推荐用如下方法来得到当前程序所在目录比较安全:

void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext );

函数来分解开始提到的_pgmptr,然后再用

void _makepath( char *path, const char *drive, const char *dir, const char *fname, const char *ext );

函数来对分解后的路径进行组合。这两个函数结合起来功能强大,使用灵活,基本上所有的有关目录和路径方面的操作都可以搞定,就是麻烦了点。

(29)设置另存为..对话框

CString str;
CFileDialog* filedialog;//设置另存为..对话框
filedialog=new CFileDialog(false,"txt",NULL,OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"文本文件(*.txt)|*.txt");
if(filedialog->DoModal()==IDOK)
{        
    str=filedialog->GetPathName();//获取文件名及路径
    CFile m_rFile;
    if (!m_rFile.Open(str,CFile::modeCreate | CFile::modeReadWrite) )
    {
        AfxMessageBox("创建文件失败");
        return;
    }
    m_rFile.SeekToEnd();
    CString rxd;
    GetDlgItemText(IDC_RXD,rxd);
    m_rFile.Write((LPCTSTR)rxd,rxd.GetLength());
    m_rFile.Flush();
    m_rFile.Close();
}
delete(filedialog);

(30)获取鼠标在屏幕上的坐标并转化为窗体坐标

CPoint pt;
GetCursorPos(&pt);   //获取鼠标在屏幕上的坐标
ScreenToClient(&pt); //将屏幕坐标转换为窗体坐标

(31)控件大小随窗体改变

响应WM_SIZE消息。

void CTempletDlg::OnSize(UINT nType, int cx, int cy)
{
    CDialog::OnSize(nType, cx, cy);
    GetDlgItem(IDC_RXD)->MoveWindow(10,10,cx-20,200);
    m_statusbar.MoveWindow(0,cy-20,cx-55,20); 
    GetDlgItem(IDC_PUSHPIN)->MoveWindow(cx-50,cy-20,50,20);
}

(32)最上层显示

void CTempletDlg::OnPushpin() //最上层显示
{
    m_bVisible=!m_bVisible;
    if(m_bVisible)
        SetWindowPos(&wndTopMost,0,0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
    else
    {
        SetWindowPos(&wndBottom,0,0,0,0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOREDRAW);
        BringWindowToTop();
    }
}

(33)创建状态栏窗口

1. 定义一个CStatusBar类型变量
    CStatusBar m_statusbar;
2. 在OnInitDialog() 加入下面代码
    UINT array[3];
    for(int i = 0;i <3;i++)
        array[i] = 100+i;

    m_statusbar.Create(this); //创建状态栏窗口
    m_statusbar.SetIndicators(array,sizeof(array)/sizeof(UINT)); //添加面板
    for(int n = 0; n<3;n++)
        m_statusbar.SetPaneInfo(n,array[n],0,95);//设置面板宽度

    m_statusbar.SetPaneInfo(2,array[2],0,850);
    m_statusbar.SetPaneText(0,"DSME R&D Dept.YX");
    m_statusbar.SetPaneText(1,"Port Closed");
    m_statusbar.SetPaneText(2,"仅支持对16进制字符进行操作及处理");
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);

(34)向编辑框赋值,并显示

SetDlgItemText(IDC_ED_TEST, _T("Sample"));

(35)改变文件保存路径

void CSCOMMDlg::OnButtonDirbrowser()
{
    static char displayname[MAX_PATH];
    static char path[MAX_PATH];
    LPITEMIDLIST pidlBrowse;    // PIDL selected by user
    BROWSEINFO bi;
    bi.hwndOwner = this->m_hWnd;
    bi.pidlRoot = NULL;
    bi.pszDisplayName = displayname;
    bi.lpszTitle = "请选择要保存接收数据的文件夹";
    bi.ulFlags = BIF_EDITBOX ;
    bi.lpfn = NULL;
    pidlBrowse=SHBrowseForFolder( &bi);
    if(pidlBrowse!=NULL)
        SHGetPathFromIDList(pidlBrowse,path);

    CString str=path;  //得到路径
    if(str.IsEmpty()) return;  //如果没有选择,就返回
    m_strCurPath=str; //接收路径编辑框对应变量
    UpdateData(FALSE);
}

(36)播放WAV文件

#include "mmsystem.h"
#pragma comment(lib,"winmm.lib")

1.通过文件名
如果一个声音文件为"C:/a.wav",播放它可以用下面的语句:
PlaySound("C:/a.wav",NULL,SND_ASYNC|SND_FILENAME);
2.通过可执行文件资源标识
导入一个.wav文件,其ID为IDR_CAMERA,这样调用:
PlaySound(MAKEINTRESOURCE(IDR_CAMERA),AfxGetResourceHandle(), SND_SYNC|SND_RESOURCE);
3. 停止当前播放的声音
PlaySound(NULL,NULL,0);

(37)点击任意位置均可拖动窗体

1.可以在LBUTTONDOWN里面发送一个点到标题的消息
PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));

2.对你的窗口添加WM_NCHITTEST消息处理函数
如果在类向导中看不到WM_NCHITTEST消息,可以将class info中的message filter改为windows就能看到了
UINT CTTTDlg::OnNcHitTest(CPoint point)
{
    // return CDialog::OnNcHitTest(point); 这是原来的默认CDialog处理函数
    return HTCAPTION;   // 改成直接返回HTCAPTION,系统就会以为你点击的位置是标题栏,也就允许拖动窗口了
}

(38)滑杆的使用

1. 在头文件中添加变量
int m_nTrackbar2;//滑杆初始位置
static int dValue[];//存储滑杆的值

2. 在CPP中:
int CCurveView::dValue[10] = {480,420,360,300,240,180,120,60,30,20};//滑杆的值的范围
CCurveView::CCurveView():CFormView(CCurveView::IDD)
{
    //{{AFX_DATA_INIT(CCurveView)
    //}}AFX_DATA_INIT
    // TODO: add construction code here
    m_nTrackbar2 = 9;//滑杆初始位置
}

void CCurveView::DoDataExchange(CDataExchange* pDX)
{
    CFormView::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CCurveView)
    DDX_Check(pDX, IDC_CHECK_ONTIME, m_ontime);
    DDX_CBIndex(pDX, IDC_COMBO_TIME, m_time);
    //}}AFX_DATA_MAP
    if(pDX->m_bSaveAndValidate)
    {
        CSliderCtrl* pSlide2 =(CSliderCtrl*) GetDlgItem(IDC_SLIDER);
        m_nTrackbar2 = pSlide2->GetPos();
    }
}

void CCurveView::OnInitialUpdate()
{
    CFormView::OnInitialUpdate();
    GetParentFrame()->RecalcLayout();
    ResizeParentToFit();

    CString strText2;//以下设置滑杆
    CSliderCtrl* pSlide2 =(CSliderCtrl*) GetDlgItem(IDC_SLIDER);
    pSlide2->SetRange(0, 9);//
    pSlide2->SetPos(m_nTrackbar2);//初始位置
    strText2.Format("%d", dValue[pSlide2->GetPos()]);
    strText2=strText2+"分钟";
    SetDlgItemText(IDC_STATIC1, strText2);
}

void CCurveView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) //滑杆调节时显示当前位置的值
{
    CSliderCtrl* pSlide = (CSliderCtrl*) pScrollBar;
    CString strText;

    switch(pScrollBar->GetDlgCtrlID())
    {
    case IDC_SLIDER:
        strText.Format("%d", dValue[pSlide->GetPos()]);
        strText=strText+"分钟";
        SetDlgItemText(IDC_STATIC1, strText);
        break;
    default:
        break;
    }
    CFormView::OnHScroll(nSBCode, nPos, pScrollBar);
}

(39)用GetModuleFileName获取程序当前执行文件名

在开发过程中经常需要获得程序当前的运行目录,这时就可以使用GetModuleFileName函数

DWORD WINAPI GetModuleFileName(HMODULE hModule, LPTSTR lpFileName, DWORD nSize);
    hModule:要获取文件名的模块名柄,null表示当前模块
    lpFileName:输出参数,存放取得的文件名
    nSize:lpFileName参数的长度

GetModuleFileName的第一个参数是HINSTANCE,你可以利用AfxGetInstanceHandle()来获得这个参数的取值。

例:
void FileName()
{
    TCHAR lpFileName[MAX_PATH];

    ::GetModuleFileName(null, lpFileName, MAX_PATH);
    SetDlgItemText(IDC_TEXTBOX, lpFileName);
}

(40)用GetModuleFileName获取应用程序当前路径,并分解

char path_buffer[_MAX_PATH];
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
GetModuleFileName(NULL, path_buffer, _MAX_PATH);
_splitpath(path_buffer, drive, dir, 0, 0);
CString strPathName;
strPathName += drive;
strPathName += dir;

(41)_makepath和_splitpath的用法

#include <stdlib.h>
#include <stdio.h>

void main(void)
{
    char path_buffer[_MAX_PATH];
    char drive[_MAX_DRIVE];
    char dir[_MAX_DIR];
    char fname[_MAX_FNAME];
    char ext[_MAX_EXT];

    _makepath(path_buffer, "c", "//sample//crt//", "makepath", "c");
    printf("Path created with _makepath: %s/n/n", path_buffer);
    _splitpath( path_buffer, drive, dir, fname, ext);
    printf("Path extracted with _splitpath:/n");
    printf("  Drive: %s/n", drive);
    printf("  Dir: %s/n", dir);
    printf("  Filename: %s/n", fname);
    printf("  Ext: %s/n", ext);
}

Output:
Path created with _makepath: c:/sample/crt/makepath.c
Path extracted with _splitpath:
    Drive:      c:
    Dir:         /sample/crt/
    Filename: makepath
    Ext:        .c

(42)压缩ACCESS数据库需先确定数据库已关闭

1.新建基于CEdit的类,如CNumberEdit,为编辑框添加CNumberEdit类型控制变量
2.在CNumberEdit中响应WM_CHAR消息
void CNumberEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    CString str;
    GetWindowText(str);
    if(nChar == 8) //退格键
    {
        CEdit::OnChar(nChar, nRepCnt, nFlags);
        return;
    }

    if(nChar == 32) //空格键
    {
        CEdit::OnChar(nChar, nRepCnt, nFlags);
        return;
    }

    //if((nChar==46)&&(!str.IsEmpty())&&(str.Find('.',0)!= -1)) //防止输入两个小数点
    //    nChar = 0;

    if(((nChar<48)||((nChar>57)&&(nChar<65))||((nChar>70)&&(nChar<97))||(nChar>102))) //只允许输入16进制字符
    {
        nChar = 0;
        AfxMessageBox("请输入16进制字符");
    }
    else
        CEdit::OnChar(nChar, nRepCnt, nFlags);
}

(43)保存位图时,背景颜色为黑色,如何更改背景颜色?

在绘图时为绘图区域填充背景颜色
void CCurveView::OnCurve(CDC *pDC)
{
    //填充背景颜色
    CRect rc(0,0,1100,700);
    CBrush newbrush,*oldbrush;
    newbrush.CreateSolidBrush(RGB(212,208,200));
    oldbrush=pDC->SelectObject(&newbrush);
    pDC->Rectangle(rc);
    newbrush.DeleteObject();
    pDC->SelectObject(oldbrush);
}

(44)采用双缓冲方式重绘以消除闪烁

void CCurveView::OnDraw(CDC* pDC) //重绘,双缓冲实现无闪烁
{
    CDC MemDC;
    CBitmap MemBitmap;
    int   x,y;
    CSize   sizeTotal=GetTotalSize();   

    x=sizeTotal.cx+20;
    y=sizeTotal.cy+15;
    MemDC.CreateCompatibleDC(pDC);
    CBitmap   *pOldBit=MemDC.SelectObject(&MemBitmap);
    MemDC.BitBlt(0,0,x,y,pDC,0,0,SRCCOPY);
    MemDC.FillSolidRect(0,0,x,y,RGB(212,208,200));

    OnCurve(&MemDC);
    pDC->BitBlt(0,0,x,y,&MemDC,0,0,SRCCOPY);
    MemBitmap.DeleteObject();
    MemDC.DeleteDC();
}

BOOL CCurveView::OnEraseBkgnd(CDC* pDC)
{
    // TODO: Add your message handler code here and/or call default

    return true;
}

(45)Radio Button 的使用方法

CButton* radioindoor;
radioindoor = (CButton*)GetDlgItem(IDC_RADIO1);
radioindoor->SetCheck(1);

(46)遍历数据库(ADO)

void CMobileNewView::DisplayRecorder()//遍历记录
{
    UpdateData(true);
    m_list.DeleteAllItems();
    m_list.DeleteColumn(3);
    for(int i=2;i>=0;i--)
        m_list.DeleteColumn(i);

    m_list.InsertColumn(0,"时间",LVCFMT_CENTER,130);
    m_list.InsertColumn(1,"数据",LVCFMT_LEFT,400);
    m_list.InsertColumn(2,"内容",LVCFMT_LEFT,100);
    ::CoInitialize(NULL);
    m_Connection.CreateInstance(__uuidof(Connection));

    try
    {
        m_Connection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=data//Mobile.mdb","","",adModeUnknown);
        m_Recordset.CreateInstance(__uuidof(Recordset));
        _variant_t RecordsAffected;
        m_Recordset=m_Connection->Execute("SELECT * FROM receive ORDER BY 编号",&RecordsAffected,adCmdText);
        if(m_Recordset->BOF)
        {
            AfxMessageBox("kong");
            return;
        }
        m_Recordset->MoveFirst();
        CString str1;
        int nItem;
        while(!m_Recordset->adoEOF)
        {
            _variant_t vCount=m_Recordset->GetCollect("时间");
            str1.Format("%S",vCount.lVal);
            nItem=m_list.InsertItem(0,str1);
            vCount=m_Recordset->GetCollect("数据");
            str1.Format("%S",vCount.lVal);
            m_list.SetItemText(nItem,1,str1);
            vCount=m_Recordset->GetCollect("内容");
            str1=VariantToString(vCount);
            m_list.SetItemText(nItem,2,LPCTSTR(str1));
            m_Recordset->MoveNext();
        }
        m_Recordset->MoveFirst();
    }
    catch(_com_error &e)
    {
        GenerateError(e.Error(),e.Description());
    }
}

(47)从数据库中读取类型为时间的字段,取出后类型为_variant_t VT_DATE,如何转换为CString?

_variant_t vCount=m_Recordset->GetCollect("时间");
COleDateTime t(vCount);
str1=t.Format("%Y-%m-%d %H:%M:%S");

(48)在基于对话框程序中按下Esc键不会关闭程序按下回车键不会关闭程序

重载PreTranslateMessage(MSG* pMsg)
BOOL CTrayMinDlg::PreTranslateMessage(MSG* pMsg)
{
    if(pMsg->message ==WM_KEYDOWN)
    {
        if( pMsg->wParam ==VK_ESCAPE)   //按下Esc键不会关闭程序
            return TRUE;

        if( pMsg->wParam ==VK_RETURN)   //按下回车键不会关闭程序
            return TRUE;
    }   

    return CDialog::PreTranslateMessage(pMsg);
}

(49)怎样让SpinButtonCtrl的up,down时改变的值为小数?

void CSyssetDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    switch(pScrollBar->GetDlgCtrlID())
    {
    case IDC_AMAL_SPIN:
        float   nStep=0.1;
        CString   str; 
        str.Format("%f",nPos * nStep);
        m_AMalEdit.SetWindowText(str);   //m_AMalEdit为edit控件变量
        break;  
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值