VC小技巧

来源:互联网 发布:天刀导入数据放哪里 编辑:程序博客网 时间:2024/04/30 10:48

VC小技巧

-----------------------------------------------------------------------------------
将自己碰到的问题的解决方法列出,希望能给遇到相同问题的朋友方便。
2007-11-09,modified by Sunwill.
------------------------------------------------------------------------------------



1.如何修改对话框及其他控件的背景颜色和文本颜色
增加CTLCOLOR事件,并在OnCtlColor函数中增加如下几行:



if(nCtlColor==CTLCOLOR_DLG)   //所有对话框

{  

HBRUSH   brush=CreateSolidBrush(RGB(255,255,204));
return   brush;  
}
else if(pWnd->GetDlgCtrlID() == IDC_STATIC1 )//资源ID为IDC_STATIC1

{
HBRUSH   brush=CreateSolidBrush(RGB(25,25,24));
pDC->SetTextColor(RGB(25,255,204));//设置文本颜色
pDC->SetBkMode(TRANSPARENT);//设置文本背景为透明
return   brush;
}
else if(nCtlColor==CTLCOLOR_STATIC) //所有STATIC控件
{  
HBRUSH   brush=CreateSolidBrush(RGB(25,255,204));
pDC->SetBkMode(TRANSPARENT);
return   brush;  
}





2.如何修改对话框背景图片



增加EraseBkgnd事件,并将OnEraseBkgnd函数的内容改为:



CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
BITMAP bmp;
bitmap.GetBitmap(&bmp);
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
dcCompatible.SelectObject(&bitmap);
CRect rect;
//GetClientRect(&rect);
GetWindowRect(&rect);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,
0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
return TRUE;

(如果没有WM_ERASEBKGND消息,则到view->Classwizard->Class   Info->Message   Filter的位置选择 Window,因为这个消息是WINDOW消息不是对话框消息 )

3.如何使用PICTURE控件



将图片bmp作为资源插入工程中,在picture控件属性页中type项选择bitmap项,在image项选择相应的资源id



4.若某个控件如按钮被其他控件挡住了,怎么设置才能显示

将改控件的Transparent选项钩上



5.隐藏对话框

增加 ShowWindow(SW_HIDE);

6.设置程序不能重复运行

增加如下几行:

HANDLE   m_hMutex;

m_hMutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"sunwill");  

if(m_hMutex==NULL)  

CreateMutex(NULL,TRUE,"sunwill");  

else  

{  

//MessageBox("程序已经运行!");  

CDialog::OnCancel();

return;

}

7.获取进程的信息

#include <tlhelp32.h>

//根据进程名称删除进程的例子

void KillProcessByName(CString sProcessName)

{

CString pname;

HANDLE handle ;  

PROCESSENTRY32 procinfo;

handle = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

procinfo.dwSize = sizeof(PROCESSENTRY32);

//获取第一条进程(一般为系统进程)

Process32First(handle, &procinfo);

do

{

pname.Format("%s",procinfo.szExeFile);

//procinfo.th32ProcessID 是进程ID

if(pname == sProcessName)

{

HANDLE handle1;

Handle1 = OpenProcess(PROCESS_ALL_ACCESS,FALSE,procinfo.th32ProcessID);

::TerminateProcess(handle1,0);  

}

}while(Process32Next(handle, &procinfo));//下一条进程

}

8.开机自动运行程序

BOOL   SetAutoRun(CString   strPath)//开机自动运行  

{  

CString   str;  

HKEY   hRegKey;  

BOOL   bResult;  

str=_T("Software//Microsoft//Windows//CurrentVersion//Run");  

if(RegOpenKey(HKEY_LOCAL_MACHINE,   str,   &hRegKey)   !=   ERROR_SUCCESS)  

bResult=FALSE;  

else  

{  

_splitpath(strPath.GetBuffer(0),NULL,NULL,str.GetBufferSetLength(MAX_ PATH+1),NULL);  

strPath.ReleaseBuffer();  

str.ReleaseBuffer();  

if(::RegSetValueEx( hRegKey,  

  str,  

  0,  

  REG_SZ,  

  (CONST   BYTE   *)strPath.GetBuffer(0),  

  strPath.GetLength()   )   !=   ERROR_SUCCESS)  

bResult=FALSE;  

else  

bResult=TRUE;  

strPath.ReleaseBuffer();  

}  

return   bResult;  

}

9.ListBox自动滚到最后一行

增加一行代码:list->SetTopIndex(list->GetCount()-1);//显示最后一行

10.VC文件操作

FILE * fp;//声明文件操作对象指针

fp=fopen(“filename”,"a+");//以追加方式打开文件

if(fp!=NULL) //continue;

{

fwrite(str,str.GetLength(),1,fp);//将str 追加到文件中

fwrite("/n/r",3,1,fp);//换行

}

fclose(fp);//关闭文件操作

11.如何弄个分隔线

用控件picture拉扁一点就成了很漂亮个分隔线

12. 使控件不显示和不可用

举个按钮的例子其他一样:

CButton *button = (Cbutton*)GetDlgItem(IDB_BUTTON1);

button->ShowWindow(0);//不显示控件

button->ShowWindow(1);//显示控件

button->EnableWindow(0);//使控件不可用

button->EnableWindow(1);//使控件可用

13.ListBox控件增加内容和清空内容

listbox->AddString(“abcdefghijklmn”);//增加一行内容

listbox->ResetContent();//清空内容

14.有控件存在的情况下在对话框工程中捕获键盘事件

(1)普通键

在ClassWizard那边选择PreTranslateMessage并增加该函数,然后在该函数中增加:

if( pMsg->message == WM_KEYUP)

return SendMessage( WM_KEYUP, pMsg->wParam, pMsg->lParam ); //

然后在OnKeyUp()函数中对相应的键做处理,如:

if(nChar>=0x30 && nChar<=0x39)

{

//做相应的处理

}

(2)上面的方法只对普通键有效,对系统键像F10,ALT则无法捕获,应该在PreTranslateMessage中增加如下的代码:

if(pMsg->message == WM_SYSKEYUP)

return SendMessage( WM_KEYUP, pMsg->wParam, pMsg->lParam );//

然后在OnSysKeyUp()中做相应的处理.

15.在VC中控制LED灯:

可用模拟键盘事件来实现,比如要控制NUMLOCK的灯,则可用如下函数

void SetNumLock(   BOOL   bState   )  

{  

BYTE   keyState[256];

GetKeyboardState((LPBYTE)&keyState);  

if((bState   &&   !(keyState[VK_NUMLOCK]   &   1))   ||   (!bState   &&   (keyState[VK_NUMLOCK]   &   1))   )  

{  

//Simulate   a   key   press  

keybd_event(   VK_NUMLOCK,  

  0x45,  

  KEYEVENTF_EXTENDEDKEY   |   0,  

  0   );

//Simulate   a   key   release  

keybd_event(   VK_NUMLOCK,  

  0x45,  

  KEYEVENTF_EXTENDEDKEY   |   KEYEVENTF_KEYUP,  

  0);  

}  

}

16 如何动态更改STATIC的背景颜色和文本颜色

在第1点已经介绍了更改STATIC的背景和文本颜色的方法. 如果要动态更改,比如按钮更改,那可以多弄个变量比如int m_nColor ,在按钮中增加
{
    m_nColor = 1;//你想要设置的值
    SendMessage(WM_CTLCOLORSTATIC,0,(LPARAM)m_hWnd);//发送消息
    Invalidate();//重绘,这个很关键
}
然后在OnCtlColor函数中对变量值进行判断, 根据变量值改变颜色.

原创粉丝点击