-----------------------------------------------------------------------------------
将自己碰到的问题的解决方法列出,希望能给遇到相同问题的朋友方便。
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函数中对变量值进行判断, 根据变量值改变颜色.
09-09
09-09
09-09