[登录] [注册]
网站首页 >> vc编程 >> 文章内容

vc小技巧

[日期:2009-05-30]   来源:碧波荡漾  作者:bbdy   [字体: ]

1、刷新窗口
 RedrawWindow(NULL, NULL,RDW_INVALIDATE | RDW_ERASE );
 
2、设置对话框背景颜色
在InitInstance函数(CChatAPP类中)中的
m_pMainWnd = &dlg;
下面加入SetDialogBkColor(RGB(240,128,128),RGB(0,0,0));
RGB(240,128,128)为背景颜色,RGB(0,0,0)为文本颜色
 
3、设置对话框背景图片
 void CChatDlg::OnPaint()中
 
 //CDialog::OnPaint();
               CPaintDC   dc(this);  
               CRect   rect;  
               GetClientRect(&rect);  
               CDC   dcMem;  
               dcMem.CreateCompatibleDC(&dc);  
               CBitmap   bmpBackground;  
               bmpBackground.LoadBitmap(IDB_BITMAP1);  
                  //IDB_BITMAP是你自己的图对应的ID  
       &nb


********************************************************
一、打开CD-ROM
mciSendString("Set cdAudio door open wait",NULL,0,NULL);
二、关闭CD_ROM
mciSendString("Set cdAudio door closed wait",NULL,0,NULL);
三、关闭计算机
OSVERSIONINFO OsVersionInfo; //包含操作系统版本信息的数据结构
OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OsVersionInfo); //获取操作系统版本信息
if(OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
...{
//Windows98,调用ExitWindowsEx()函数重新启动计算机

DWORD dwReserved;
ExitWindowsEx(EWX_REBOOT,dwReserved); //可以改变第一个参数,实现注销用户、
//关机、关闭电源等操作
// 退出前的一些处理程序
}
四、重启计算机
typedef int (CALLBACK *SHUTDOWNDLG)(int); //显示关机对话框函数的指针
HINSTANCE hInst = LoadLibrary("shell32.dll"); //装入shell32.dll
SHUTDOWNDLG ShutDownDialog; //指向shell32.dll库中显示关机对话框函数的指针
if(hInst != NULL)
...{
//获得函数的地址并调用之
ShutDownDialog = (SHUTDOWNDLG)GetProcAddress(hInst,(LPSTR)60);

(*ShutDownDialog)(0);
}
五、枚举所有字体
LOGFONT lf;
lf.lfCharSet = DEFAULT_CHARSET; // Initialize the LOGFONT structure
strcpy(lf.lfFaceName,"");
CClientDC dc (this);
// Enumerate the font families
::EnumFontFamiliesEx((HDC) dc,&lf,                                                                                      
(FONTENUMPROC) EnumFontFamProc,(LPARAM) this,0);
//枚举函数
int CALLBACK EnumFontFamProc(LPENUMLOGFONT lpelf,
LPNEWTEXTMETRIC lpntm,DWORD nFontType,long lparam)

...{
// Create a pointer to the dialog window
CDay7Dlg* pWnd = (CDay7Dlg*) lparam;
// add the font name to the list box
pWnd ->m_ctlFontList.AddString(lpelf ->elfLogFont.lfFaceName);
// Return 1 to continue font enumeration
return 1;
}
其中m_ctlFontList是一个列表控件变量
六、一次只运行一个程序实例,如果已运行则退出
if( FindWindow(NULL,"程序标题")) exit(0);
七、得到当前鼠标所在位置
CPoint pt;
GetCursorPos(&pt); //得到位置
八、上下文菜单事件触发事件:OnContextMenu事件

九、显示和隐藏程序菜单
CWnd *pWnd=AfxGetMainWnd();
if(b_m) //隐藏菜单
...{
pWnd->SetMenu(NULL);
pWnd->DrawMenuBar();
b_m=false;
}
else
...{
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME); ////显示菜单 也可改变菜单项
pWnd->SetMenu(&menu);
pWnd->DrawMenuBar();
b_m=true;
menu.Detach();
}
十、获取可执行文件的图标
HICON hIcon=::ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0);
if (hIcon &&hIcon!=(HICON)-1)
...{
pDC->DrawIcon(10,10,hIcon);

}
DestroyIcon(hIcon);
十一、窗口自动靠边程序演示
BOOL AdjustPos(CRect* lpRect)
...{//自动靠边
int iSX=GetSystemMetrics(SM_CXFULLSCREEN);
int iSY=GetSystemMetrics(SM_CYFULLSCREEN);
RECT rWorkArea;
BOOL bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), &rWorkAre
a, 0);
CRect rcWA;
if(!bResult)
...{//如果调用不成功就利用GetSystemMetrics获取屏幕面积
rcWA=CRect(0,0,iSX,iSY);
}
else
rcWA=rWorkArea;
int iX=lpRect->left;
int iY=lpRect->top;

if(iX < rcWA.left + DETASTEP && iX!=rcWA.left)
...{//调整左
//pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE);
lpRect->OffsetRect(rcWA.left-iX,0);
AdjustPos(lpRect);
return TRUE;
}
if(iY < rcWA.top + DETASTEP && iY!=rcWA.top)
...{//调整上
//pWnd->SetWindowPos(NULL ,iX,rcWA.top,0,0,SWP_NOSIZE);
lpRect->OffsetRect(0,rcWA.top-iY);
AdjustPos(lpRect);
return TRUE;
}
if(iX + lpRect->Width() > rcWA.right - DETASTEP && iX !=rcWA.right-lpRect->W

idth())
...{//调整右
//pWnd->SetWindowPos(NULL ,rcWA.right-rcW.Width(),iY,0,0,SWP_NOSIZE);
lpRect->OffsetRect(rcWA.right-lpRect->right,0);
AdjustPos(lpRect);
return TRUE;
}
if(iY + lpRect->Height() > rcWA.bottom - DETASTEP && iY !=rcWA.bottom-lpRect
->Height())
...{//调整下
//pWnd->SetWindowPos(NULL ,iX,rcWA.bottom-rcW.Height(),0,0,SWP_NOSIZE);
lpRect->OffsetRect(0,rcWA.bottom-lpRect->bottom);
return TRUE;
}
return FALSE;
}
//然后在ONMOVEING事件中使用所下过程调用

CRect r=*pRect;
AdjustPos(&r);
*pRect=(RECT)r;
十二、给系统菜单添加一个菜单项
给系统菜单添加一个菜单项需要进行下述三个步骤:
首先,使用Resource Symbols对话(在View菜单中选择Resource Symbols...可以显
示该对话)定义菜单项ID,该ID应大于0x0F而小于0xF000;
其次,调用CWnd::GetSystemMenu获取系统菜单的指针并调用CWnd:: Appendmenu将菜单
项添加到菜单中。下例给系统菜单添加两个新的
int CMainFrame:: OnCreate (LPCREATESTRUCT lpCreateStruct)
...{

//Make sure system menu item is in the right range.

ASSERT(IDM_MYSYSITEM<0xF000);
//Get pointer to system menu.
CMenu* pSysMenu=GetSystemMenu(FALSE);
ASSERT_VALID(pSysMenu);
//Add a separator and our menu item to system menu.
CString StrMenuItem(_T ("New menu item"));
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_MYSYSITEM, StrMenuItem);

}
十三、运行其它程序
//1、运行EMAIL或网址
char szMailAddress[80];
strcpy(szMailAddress,"mailto:netvc@21cn.com");
ShellExecute(NULL, "open", szMailAddress, NULL, NULL, SW_SHOWNORMAL);

//2、运行可执行程序
WinExec("notepad.exe",SW_SHOW); //运行计事本
十四、动态增加或删除菜单
1、 增加菜单
//添加
CMenu *mainmenu;
mainmenu=AfxGetMainWnd()->GetMenu(); //得到主菜单
(mainmenu->GetSubMenu (0))->AppendMenu (MF_SEPARATOR);//添加分隔符
(mainmenu->GetSubMenu (0))->AppendMenu(MF_STRING,ID_APP_ABOUT,_T("Always on
&Top")); //添加新的菜单项
DrawMenuBar(); //重画菜单
2、 删除菜单
//删除
CMenu *mainmenu;
mainmenu=AfxGetMainWnd()->GetMenu(); //得到主菜单

CString str ;
for(int i=(mainmenu->GetSubMenu (0))->GetMenuItemCount()-1;i>=0;i--) //取得菜
单的项数。
...{
(mainmenu->GetSubMenu (0))->GetMenuString(i,str,MF_BYPOSITION);
//将指定菜单项的标签拷贝到指定的缓冲区。MF_BYPOSITION的解释见上。
if(str=="Always on &Top") //如果是刚才我们增加的菜单项,则删除。
...{
(mainmenu->GetSubMenu (0))->DeleteMenu(i,MF_BYPOSITION);
break;
}
十五、改变应用程序的图标
静态更改: 修改图标资源IDR_MAINFRAME。它有两个图标,一个是16*16的,另一个是3

2*32的,注意要一起修改。
动态更改: 向主窗口发送WM_SETICON消息.代码如下:
HICON hIcon=AfxGetApp()->LoadIcon(IDI_ICON);
ASSERT(hIcon);
AfxGetMainWnd()->SendMessage(WM_SETICON,TRUE,(LPARAM)hIcon);
十六、另一种改变窗口标题的方法
使用语句 CWnd* m_pCWnd = AfxGetMainWnd( ),然后,再以如下形式调用SetWindowTe
xt()函数:
SetWindowText( *m_pCWnd,(LPCTSTR)m_WindowText);// m_WindowText可以是一个CSt
ring类的变量。
十七、剪切板上通过增强元文件拷贝图像数据
下面代码拷贝通过元文件拷贝图像数据到任何应用程序,其可以放置在CView派生类的函

数中。
CMetaFileDC * m_pMetaDC = new CMetaFileDC();
m_pMetaDC->CreateEnhanced(GetDC(),NULL,NULL,"whatever");
//draw meta file
//do what ever you want to do: bitmaps, lines, text...
//close meta file dc and prepare for clipboard;
HENHMETAFILE hMF = m_pMetaDC->CloseEnhanced();
//copy to clipboard
OpenClipboard();
EmptyClipboard();
::SetClipboardData(CF_ENHMETAFILE,hMF);                                                                                
CloseClipboard();

//DeleteMetaFile(hMF);
delete m_pMetaDC;
十八、剪切板上文本数据的传送
把文本放置到剪接板上:
CString source;
//put your text in source
if(OpenClipboard())
...{
HGLOBAL clipbuffer;
char * buffer;
EmptyClipboard();
clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1);
buffer = (char*)GlobalLock(clipbuffer);
strcpy(buffer, LPCSTR(source));
GlobalUnlock(clipbuffer);
SetClipboardData(CF_TEXT,clipbuffer);
CloseClipboard();
}
从剪接板上获取文本:

char * buffer;
if(OpenClipboard())
...{
buffer = (char*)GetClipboardData(CF_TEXT);
//do something with buffer here
//before it goes out of scope
}
CloseClipboard();
十九、将捕捉屏幕图像到剪切版中
void CShowBmpInDlgDlg::OnCutScreen()
...{
ShowWindow(SW_HIDE);
RECT r_bmp=...{0,0,::GetSystemMetrics(SM_CXSCREEN),
::GetSystemMetrics(SM_CYSCREEN)};                                                                                      
HBITMAP hBitmap;
hBitmap=CopyScreenToBitmap(&r_bmp);

//hWnd为程序窗口句柄
if (OpenClipboard())
...{
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBitmap);
CloseClipboard();
}
ShowWindow(SW_SHOW);
}
HBITMAP CShowBmpInDlgDlg::CopyScreenToBitmap(LPRECT lpRect)
...{
//lpRect 代表选定区域
...{
HDC hScrDC, hMemDC;
// 屏幕和内存设备描述表
HBITMAP hBitmap, hOldBitmap;
// 位图句柄
int nX, nY, nX2, nY2;
// 选定区域坐标
int nWidth, nHeight;
// 位图宽度和高度
int xScrn, yScrn;
// 屏幕分辨率

// 确保选定区域不为空矩形
if (IsRectEmpty(lpRect))
return NULL;
//为屏幕创建设备描述表
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);
// 获得选定区域坐标
nX = lpRect->left;
nY = lpRect->top;
nX2 = lpRect->right;
nY2 = lpRect->bottom;
// 获得屏幕分辨率
xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES);
//确保选定区域是可见的
if (nX<0)

nX = 0;
if (nY<0)
nY = 0;
if (nX2>xScrn)
nX2 = xScrn;
if (nY2>yScrn)
nY2 = yScrn;
nWidth = nX2 - nX;
nHeight = nY2 - nY;
// 创建一个与屏幕设备描述表兼容的位图
hBitmap = CreateCompatibleBitmap
(hScrDC, nWidth, nHeight);
// 把新位图选到内存设备描述表中
hOldBitmap =(HBITMAP)SelectObject(hMemDC, hBitmap);
// 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight,
hScrDC, nX, nY, SRCCOPY);
//得到屏幕位图的句柄
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);

//清除
DeleteDC(hScrDC);
DeleteDC(hMemDC);
// 返回位图句柄
return hBitmap;
}
}
二十、如何将位图缩放显示在Static控件中
//在Staic控件内显示位图
void CShowBmpInDlgDlg::ShowBmpInStaic()
...{
CBitmap hbmp;
HBITMAP hbitmap;
//将pStatic指向要显示的地方
CStatic *pStaic;
pStaic=(CStatic*)GetDlgItem(IDC_IMAGE);
//装载资源 MM.bmp是我的一个文件名,用你的替换
hbitmap=(HBITMAP)::LoadImage (::AfxGetInstanceHandle(),"MM.bmp",
IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);

hbmp.Attach(hbitmap);
//获取图片格式
BITMAP bm;
hbmp.GetBitmap(&bm);
CDC dcMem;
dcMem.CreateCompatibleDC(GetDC());
CBitmap *poldBitmap=(CBitmap*)dcMem.SelectObject(hbmp);
CRect lRect;
pStaic->GetClientRect(&lRect);
//显示位图
pStaic->GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Heigh
t(),
&dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
dcMem.SelectObject(&poldBitmap);
}

 

/////////////////////////////////////////////////////////
VC学习笔记1:按钮的使能与禁止

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

m_Button1.EnableWindow(true); 使按钮处于允许状态
m_Button1.EnableWindow(false); 使按钮被禁止,并变灰显示


VC学习笔记2:控件的隐藏与显示

用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 );    //显示控件

以上方法常用于动态生成控件,虽说用控件的Create函数可以动态生成控件,但这种控件很不好控制,所以用隐藏、显示方法不失为一种替代手段。


VC学习笔记3:改变控件的大小和位置

用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 );    //编辑控件的大小和位置都改变
以上方法也适用于各种窗口。


VC学习笔记4:什么时候设定视中控件的初始尺寸?

我在CFormView的视中加入了一个编辑控件,在运行时使它充满客户区,当窗口改变大小时它也跟着改变。
改变控件尺寸可以放在OnDraw()函数中,也可放在CalcWindowRect()函数中,当窗口尺寸发生变化时,它们都将被执行,且CalcWindowRect()函数先于OnDraw()函数,下例是在CalcWindowRect()函数中修改控件尺寸。
重载VIEW类的CalcWindowRect函数,把设定控件的尺寸的语句加入这个函数中。
例:
void CMyEditView::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType) 
{
    // TODO: Add your specialized code here and/or call the base class
 
 
 
 作者: kony2008  2006-9-11 15:52   回复此发言   
 
--------------------------------------------------------------------------------
 
2 VC学习笔记 -单选按钮控件(Ridio Button)的使用(zt) 
 
    CFrameWnd *pFrameWnd=GetParentFrame(); //获取框架窗口指针

    CRect rect;
    pFrameWnd->GetClientRect(&rect); //获取客户区尺寸

    CWnd *pEditWnd=GetDlgItem(IDC_MYEDIT); //获取编辑控件指针,IDC_MYEDIT为控件ID号
    pEditWnd->SetWindowPos(NULL,0,0,rect.right,rect.bottom-50,SWP_NOMOVE | SWP_NOZORDER); //设定控件尺寸,bottom-50是为了让出状态条位置。

    CFormView::CalcWindowRect(lpClientRect, nAdjustType);
}


VC学习笔记5:单选按钮控件(Ridio Button)的使用

一、对单选按钮进行分组:
每组的第一个单选按钮设置属性:Group,Tabstop,Auto;其余按钮设置属性Tabstop,Auto。

如:
Ridio1、Ridio2、Ridio3为一组,Ridio4、Ridio5为一组

设定Ridio1属性:Group,Tabstop,Auto
设定Ridio2属性:Tabstop,Auto
设定Ridio3属性:Tabstop,Auto

设定Ridio4属性:Group,Tabstop,Auto
设定Ridio5属性:Tabstop,Auto

二、用ClassWizard为单选控件定义变量,每组只能定义一个。如:m_Ridio1、m_Ridio4。

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

void CWEditView::OnRadio1() 
{
    m_Ridio1 = 0;    //第一个单选按钮被选中
}

void CWEditView::OnRadio2() 
{
    m_Ridio1 = 1;    //第二个单选按钮被选中
}

void CWEditView::OnRadio3() 
{
    m_Ridio1 = 2;    //第三个单选按钮被选中
}

void CWEditView::OnRadio4() 
{
    m_Ridio4 = 0;    //第四个单选按钮被选中
}

void CWEditView::OnRadio5() 
{
    m_Ridio4 = 1;    //第五个单选按钮被选中
}

四、设置默认按钮:
在定义控件变量时,ClassWizard在构造函数中会把变量初值设为-1,只需把它改为其它值即可。
如:
//{{AFX_DATA_INIT(CWEditView)
m_Ridio1 = 0;    //初始时第一个单选按钮被选中
m_Ridio4 = 0;    //初始时第四个单选按钮被选中
//}}AFX_DATA_INIT


VC学习笔记6:旋转控件(Spin)的使用

当单击旋转控件上的按钮时,相应的编辑控件值会增大或减小。其设置的一般步骤为:
一、在对话框中放入一个Spin控件和一个编辑控件作为Spin控件的伙伴窗口,
设置Spin控件属性:Auto buddy、Set buddy integer、Arrow keys
设置文本控件属性:Number

二、用ClassWizard为Spin控件定义变量m_Spin,为编辑控件定义变量m_Edit,定义时注意要把m_Edit设置为int型。

三、在对话框的OnInitDialog()函数中加入语句:
BOOL CMyDlg::OnInitDialog() 
{
    CDialog::OnInitDialog();
    
    m_Spin.SetBuddy( GetDlgItem( IDC_EDIT1 ) );    //设置编辑控件为Spin控件的伙伴窗口
    m_Spin.SetRange( 0, 10 );    //设置数据范围为0-10
    return TRUE;
}

四、用ClassWizard为编辑控件添加EN_CHANGE消息处理函数,再加入语句:
void CMyDlg::OnChangeEdit1() 
{
    m_Edit = m_Spin.GetPos();    //获取Spin控件当前值
}

OK!


VC学习笔记7:程序结束时保存文件问题

在文档-视图结构中,用串行化自动保存文件在各种VC书上都有介绍。现在的问题是我不使用串行化,而是自己动手保存,当点击窗口的关闭按钮时,如何提示并保存文档。

用ClassWizard在文档类(CxxDoc)中添加函数CanCloseFrame(),再在其中加入保存文件的语句就可以了。
注:要保存的数据应放在文档类(CxxDoc)或应用程序类(CxxApp)中,不要放在视图类中。

例:
//退出程序
BOOL CEditDoc::CanCloseFrame(CFrameWnd* pFrame) 
{
    CFile file;
    if(b_Flag)    //b_Flag为文档修改标志,在修改文档时将其置为True
    {
        int t;
        t=::MessageBox(NULL,"文字已经改变,要存盘吗?","警告",
                MB_YESNOCANCEL | MB_ICONWARNING);    //弹出提示对话框
        if(t==0 || t==IDCANCEL)
            return false;
        if(t==IDYES)
        {
            CString sFilter="Text File(*.txt)|*.txt||";
            CFileDialog m_Dlg(FALSE,"txt",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,(LPCTSTR)sFilter,NULL);    //定制文件对话框

            int k=m_Dlg.DoModal();    //弹出文件对话框
            if(k==IDCANCEL || k==0)
                return false;
            m_PathName=m_Dlg.GetPathName();    //获取选择的文件路径名
            
            file.Open(m_PathName,CFile::modeCreate | CFile::modeWrite);
            file.Write(m_Text,m_TextLen);    //数据写入文件
            file.Close();
        }
    }
    return CDocument::CanCloseFrame(pFrame);
}


VC学习笔记8:UpdateData()

对于可以接收数据的控件,如编辑控件来说,UpdateData()函数至关重要。当控件内容发生变化时,对应的控件变量的值并没有跟着变化,同样,当控件变量值变化时,控件内容也不会跟着变。
UpdateData()函数就是解决这个问题的。

UpdateData(true);把控件内容装入控件变量
UpdateData(false);用控件变量的值更新控件

如:有编辑控件IDC_EDIT1,对应的变量为字符串m_Edit1,
1、修改变量值并显示在控件中:
m_Edit1 = _T("结果为50");
UpdateData(false);
2、读取控件的值到变量中:
用ClassWizard为IDC_EDIT1添加EN_CHANGE消息处理函数,
void CEditView::OnChangeEdit1()
{
    UpdateData(true);
}
 
VC学习笔记9:打开文件界面
按钮响应函数中添加如下代码
char szFilter[] = "JPG Files (*.jpg)|*.jpg|JPEG Files (*.jpeg)|*.jpeg|GIF Files (*.gif)|*.gif|All Files (*.*)|*.*||";
CFileDialog dlg(TRUE,"jpg|jpeg|gif",NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
if(dlg.DoModal() == IDOK)
{
CString strPathName = dlg.GetPathName();               
}


VC学习笔记10:VC中使用GDI+在内存转换图片类型

微软新推出的GDI+功能强大,本文仅对图片转换加以讨论,不足之处请大家指出。
图片类型的转换支持:bmp、dib、png、gif、jpeg/jpg、tiff、emf等。以下是详细步骤。

首先,在StdAfx.h中静态调用diplus.lib,即由编译系统完成对DLL的加载,应用程序结束时卸载DLL的编码。如下:

#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#include "GdiPlus.h"
using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")
#endif

  在类的头文件中定义,以下成员变量,用来初始化GDI+的使用和结束使用。

GdiplusStartupInput m_gdiplusStartupInput;
ULONG_PTR m_gdiplusToken;

  然后在OnCreate()函数中加入初始化GDI+的函数:

GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL); 

  在OnDestroy()函数中加入结束GDI+使用的函数: GdiplusShutdown(m_gdiplusToken);

  接着,定义转换函数:

BOOL MBmpToMImage(CMemFile& cbfBmp, CMemFile& cbfImage, CString strType)

  其中:

  CMemFile& cbfBmp表示原位图文件;
  CMemFile& cbfImage表示转换后的图形文件;
  CString strType表示转换的图片类型。

  该函数中主要的处理为以下几步:

  将原位图文件转换为IStream
  定义Image类实例,并使用第1步获得的IStream初始化
  获取转换的图片类型的CLSID
  将Image以转换的图片类型保存到IStream中
  将IStream转换为CMemFile内存文件(也可为CFile)

  详细代码如下:

BOOL MBmpToMImage(CMemFile& cbfBmp, CMemFile& cbfImage, CString strType)
{
 int iBmpSize = cbfBmp.GetLength();
 HGLOBAL hMemBmp = GlobalAlloc(GMEM_FIXED, iBmpSize);
 if (hMemBmp == NULL) return FALSE;
 IStream* pStmBmp = NULL;
 CreateStreamOnHGlobal(hMemBmp, FALSE, &pStmBmp);
 if (pStmBmp == NULL)
 {
  GlobalFree(hMemBmp);
  return FALSE;
 }
 BYTE* pbyBmp = (BYTE *)GlobalLock(hMemBmp);
 cbfBmp.SeekToBegin();
 cbfBmp.Read(pbyBmp, iBmpSize);

 Image* imImage = NULL;
 imImage = Image::FromStream(pStmBmp, FALSE);
 if (imImage == NULL)
 {
  GlobalUnlock(hMemBmp);
  GlobalFree(hMemBmp);
  return FALSE;
 }
 USES_CONVERSION;
 CLSID clImageClsid;
 GetImageCLSID(A2W("image/"+strType.GetBuffer(0)), &clImageClsid);

 HGLOBAL hMemImage = GlobalAlloc(GMEM_MOVEABLE, 0);
 if (hMemImage == NULL)
 {
  pStmBmp->Release();
  GlobalUnlock(hMemBmp);
  GlobalFree(hMemBmp);
  if (imImage != NULL) delete imImage;
  return FALSE;
 } 
 IStream* pStmImage = NULL;
 CreateStreamOnHGlobal(hMemImage, TRUE, &pStmImage);
 if (pStmImage == NULL)
 {
  pStmBmp->Release();
  GlobalUnlock(hMemBmp);
  GlobalFree(hMemBmp);
  GlobalFree(hMemImage);
  if (imImage != NULL) delete imImage
   return FALSE;
 }
 imImage->Save(pStmImage, &clJpgClsid);
 if (pStmImage == NULL)
 {
  pStmBmp->Release();
  pStmImage>Release();
  GlobalUnlock(hMemBmp);
  GlobalFree(hMemBmp);
  GlobalFree(hMemImage;
  if (imImage != NULL) delete imImage;
  return FALSE;
 }
 LARGE_INTEGER liBegin = {0};
 pStmImage->Seek(liBegin, STREAM_SEEK_SET, NULL);
 BYTE* pbyImage = (BYTE *)GlobalLock(hMemImage);
 cbfImage.SeekToBegin();
 cbfImage.Write(pbyImage, GlobalSize(hMemImage));

 if (imImage != NULL) delete imImage;
 pStmBmp->Release();
 pStmImage->Release();
 GlobalUnlock(hMemBmp);
 GlobalUnlock(hMemImage);
 GlobalFree(hMemBmp);
 GlobalFree(hMemImage);
 return TRUE;
}
////////////////////////////////////////////////
VC学习笔记11:VC6.0中GdiPlus的使用以及一个小例子
////////////////////////////////////////////////
1.GDIPlus需要下载sdk开发包

2.在tool,option,direction,include files下设置头文件路径...\MICROSOFT SDK\INCLUDE,在tool,option,direction,libaray  files下设置lib路径...\MICROSOFT SDK\SDK8\LIB,在project, setting, link, object/modules libaray里面输入gdiplus.lib.

注意,路径一定要放在最上层,还有,一定要是绝对路径,上面的...需要自己补充完整

3.新建一个单文档工程XXX,给XXXApp类添加成员变量

protected:
   GdiplusStartupInput m_gdiplusStartupInput;
   ULONG_PTR           m_gdiplusToken;
在XXXApp::InitInstance()里面添加:GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL);

重载XXXApp::ExitInstance(),在里面添加:GdiplusShutdown(m_gdiplusToken);

注意,以上修改过的文件前面要加上以下语句:

#include <GdiPlus.h>
using namespace Gdiplus;

上面的事情做完,你就可以在程序中使用gdiplus了,以下是一个把bmp转换成jpg的小例子:

int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
   UINT  num = 0;          // number of image encoders
   UINT  size = 0;         // size of the image encoder array in bytes

   ImageCodecInfo* pImageCodecInfo = NULL;

   GetImageEncodersSize(&num, &size);
   if(size == 0)
      return -1;  // Failure

   pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
   if(pImageCodecInfo == NULL)
      return -1;  // Failure

   GetImageEncoders(num, size, pImageCodecInfo);

   for(UINT j = 0; j < num; ++j)
   {
      if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
      {
         *pClsid = pImageCodecInfo[j].Clsid;
         free(pImageCodecInfo);
         return j;  // Success
      }   
   }

   free(pImageCodecInfo);
   return -1;  // Failure
}

void BMP2JPG(CString strBMPFile,CString strJPGFile)
{
    CLSID  encoderClsid;
    WCHAR  strGuid[39];
    if(GetEncoderClsid(L"image/jpeg", &encoderClsid) >= 0)
    StringFromGUID2(encoderClsid, strGuid, 39);
 
    Image image(strBMPFile.AllocSysString());
    image.Save(strJPGFile.AllocSysString(),&encoderClsid,NULL);

}
当然,上面的例子所在文件前面也必须加上

#include <GdiPlus.h>
using namespace Gdiplus;

***********************************************
、控件随窗口大小而自动缩放
void CDVRDlg::OnSize(UINT nType, int cx, int cy)
{
RECT rcClient;
if (GetDlgItem(IDC_STATIC_aa))
{
   GetClientRect(&rcClient);
   rcClient.left+=10;
   rcClient.right-=10;
   rcClient.top+=10;
   rcClient.bottom-=10;
   GetDlgItem(IDC_STATIC_aa)->MoveWindow(&rcClient);
}
}
2、CButtonST

Short shBtnColor = 30;
m_bGogo.SetIcon(IDI_HALLOWEEN2, IDI_HALLOWEEN1);//设置按钮图标
m_bGogo.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, shBtnColor);//设置按钮亮度
m_bGogo.DrawBorder(FALSE);//设置按钮边框
m_bGogo.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(0, 128, 0));//设置按钮字体颜色
m_bGogo.SetAlign(CButtonST::ST_ALIGN_HORIZ_RIGHT);//设置按钮图标位置
m_bGogo.DrawFlatFocus(TRUE);//设置虚线框 // HyperLink button
m_btnHyperLink.SetIcon(IDI_WEB2);
m_btnHyperLink.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, shBtnColor);
m_btnHyperLink.SetURL(IDS_WEBADDR);
m_btnHyperLink.SetTooltipText(IDS_WEBADDR);
m_btnHyperLink.SetBtnCursor(IDC_HAND2);
3、解析字符串
CString a = "aaa,sss,ddd,fff";
CString b[100000];
int bb = 0;
for ( int i=0; i<a.GetLength(); i++ )
     if ( a[i]==',' )
     {
         bb ++;
     }
     else
    {
      b[bb] = b[bb] + a[i];
    }
4、取得本地IP
char name[255];
CString ip;
PHOSTENT hostinfo;
if(gethostname ( name, sizeof(name)) == 0)
{
//如果能够获取计算机主机信息的话,则获取本机IP地址
if ((hostinfo = gethostbyname(name)) != NULL)
{
   //获取本机IP地址
   LPCSTR ip=inet_ntoa(*(struct in_addr*)*hostinfo->h_addr_list);
   //输出IP地址
   AfxMessageBox(ip);
}
}
**************************************
VC 编辑框 改变背景、字体、文本颜色、长度限制、英文 汉字判断    
1。长度限制OnInitDialog()中:m_edit1.SetLimitText(8);                           //m_edit1为编辑框的成员变量或者CEdit*pEdt=(CEdit*)GetDlgItem(IDC_EDIT1);
pEdt->SetLimitText(8);                              //限制编辑框输入长度为8字节2。汉字判断方法一、CString str="ab你c好。。";for(int i=0;i<str.GetLength();i++)
{
if(   (BYTE)str[i]   <   0x80 )
{  
      MessageBox("非汉字");
}      
else//汉字  
{  
    MessageBox("是汉字");
}                                                                    //方法不好,只能判断有没有汉字方法二、CString   ss="dd你aa今bb真cc";
int i=0;
while(i<ss.GetLength())
{    if(IsDBCSLeadByte(ss[i]))
    {       //   是DBCS
       i += 2;
       AfxMessageBox("汉字");
     }     else    {      //   英文
      i ++;
      AfxMessageBox("English");
     }
   }附原帖:http://topic.csdn.net/t/20020728/12/905767.html3。字体及大小定义一全局变量或成员变量CFont   font;                                        //不要定义成局部变量,否则没效果CEdit*pEdt=(CEdit*)GetDlgItem(IDC_EDIT1);
font.CreatePointFont(266,"Arial");
pEdt->SetFont(&font);4。背景及文本颜色定义一成员变量CBrush m_brush;OnInitDialog()中进行初始化工作m_brush.CreateSolidBrush(RGB(255,0,0));然后在OnCtrlColor中HBRUSH CAsdfaaaaaaaaaDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(nCtlColor==CTLCOLOR_EDIT &&                           pWnd->GetDlgCtrlID()==IDC_EDIT1)//注意此处的(pWnd->),否则没效果
{
pDC->SetTextColor(RGB(255,0,0));
pDC->SetBkColor(RGB(255,255,0));//设置文本背景色
pDC->SetBkMode(TRANSPARENT);//设置背景透明
hbr = (HBRUSH)m_brush;
}return hbr;
}对于nCtlColor的类型,如下:CTLCOLOR_BTN   Button control
CTLCOLOR_DLG   Dialog box
CTLCOLOR_EDIT   Edit control
CTLCOLOR_LISTBOX   List-box control
CTLCOLOR_MSGBOX   Message box
CTLCOLOR_SCROLLBAR   Scroll-bar control
CTLCOLOR_STATIC   Static control

相关文章
相关评论