原文:
http://blog.csdn.net/benny5609/archive/2008/02/28/2130269.aspx1 toolbar默認(rèn)位圖左上角那個(gè)點(diǎn)的顏色是透明色,不喜歡的話可以自己改。
2 VC++中 WM_QUERYENDSESSION WM_ENDSESSION 為系統(tǒng)關(guān)機(jī)消息。
4 在VC下執(zhí)行DOS命令
a. system("md c:\\12");
b. WinExec("Cmd.exe /C md c:\\12", SW_HIDE);
c. ShellExecute
ShellExecute(NULL,"open","d:\\WINDOWS\\system32\\cmd.exe","/c md d:\\zzz","",SW_SHOW);
d. CreateProcess
下面這個(gè)示例的函數(shù)可以把給定的DOS命令執(zhí)行一遍,并把DOS下的輸出內(nèi)容記錄在buffer中。同時(shí)示范了匿名管道重定向輸出的用法:
-------------------------------------------------------------------------------------
BOOL CDOSDlg::ExecDosCmd()
{
#define EXECDOSCMD "dir c:" //可以換成你的命令
SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead,&hWrite,&sa,0))
{
return FALSE;
}
char command[1024]; //長達(dá)1K的命令行,夠用了吧
strcpy(command,"Cmd.exe /C ");
strcat(command,EXECDOSCMD);
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite; //把創(chuàng)建進(jìn)程的標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到管道輸入
si.hStdOutput = hWrite; //把創(chuàng)建進(jìn)程的標(biāo)準(zhǔn)輸出重定向到管道輸入
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
//關(guān)鍵步驟,CreateProcess函數(shù)參數(shù)意義請查閱MSDN
if (!CreateProcess(NULL, command,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
{
CloseHandle(hWrite);
CloseHandle(hRead);
return FALSE;
}
CloseHandle(hWrite);
char buffer[4096] = {0}; //用4K的空間來存儲輸出的內(nèi)容,只要不是顯示文件內(nèi)容,一般情況下是夠用了。
DWORD bytesRead;
while (true)
{
if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
break;
//buffer中就是執(zhí)行的結(jié)果,可以保存到文本,也可以直接輸出
AfxMessageBox(buffer); //這里是彈出對話框顯示
}
CloseHandle(hRead);
return TRUE;
}
-------------------------------------------------------------------------------------
5 刪除目錄,包含刪除子文件夾以及其中的內(nèi)容
-------------------------------------------------
BOOL DeleteDirectory(char *DirName)//如刪除 DeleteDirectory("c:\\aaa")
{
CFileFind tempFind;
char tempFileFind[MAX_PATH];
sprintf(tempFileFind,"%s\\*.*",DirName);
BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
while(IsFinded)
{
IsFinded=(BOOL)tempFind.FindNextFile();
if(!tempFind.IsDots())
{
char foundFileName[MAX_PATH];
strcpy(foundFileName,tempFind.GetFileName().GetBuffer(MAX_PATH));
if(tempFind.IsDirectory())
{
char tempDir[MAX_PATH];
sprintf(tempDir,"%s\\%s",DirName,foundFileName);
DeleteDirectory(tempDir);
}
else
{
char tempFileName[MAX_PATH];
sprintf(tempFileName,"%s\\%s",DirName,foundFileName);
DeleteFile(tempFileName);
}
}
}
tempFind.Close();
if(!RemoveDirectory(DirName))
{
MessageBox(0,"刪除目錄失敗!","警告信息",MB_OK);//比如沒有找到文件夾,刪除失敗,可把此句刪除
return FALSE;
}
return TRUE;
}
-------------------------------------------------------------
6 讓程序暫停:system("PAUSE");
7 在PreTranslateMessage中捕捉鍵盤事件
if (pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN)return TRUE; //注意return的值
8 更改按鍵消息(下面的代碼可把回車鍵消息改為TAB鍵消息)
-------------------------------------------------------
BOOL CT3Dlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN && VK_RETURN == pMsg->wParam)
{
pMsg->wParam = VK_TAB;
}
return CDialog::PreTranslateMessage(pMsg);
}
------------------------------------------
9 MoveWindow: 一個(gè)可以移動(dòng)、改變窗口位置和大小的函數(shù)
10 16進(jìn)制轉(zhuǎn)化成10進(jìn)制小數(shù)的問題
用一個(gè)讀二進(jìn)制文件的軟件讀文件
二進(jìn)制文件中的一段 8F C2 F5 3C 最后變成了 0.03
請問這是怎么轉(zhuǎn)換過來的??
方法一:浮點(diǎn)技術(shù)法,如
DWORD dw=0x3CF5C28F;
float d=*(float*)&dw;//0.03;
方法二:浮點(diǎn)的儲存方式和整數(shù)完全兩樣,你想了解的話可以去
http://www.zahui.com/html/1/3630.htm
看一看,不過通常我們都不必了解它就可以完成轉(zhuǎn)換。
char a[4] = {0x8F, 0xC2, 0xF5, 0x3C};
float f;
memcpy(&f,a,sizeof(float));
TRACE("%d",0x3CF5C28F);
12 在其它進(jìn)程中監(jiān)視鍵盤消息:用SetWindowsHookEx(WH_KEYBOARD_LL,...);
13 在桌面上任意位置寫字
HDC deskdc = ::GetDC(0);
CString stext = "我的桌面";
::TextOut(deskdc,100,200,stext,stext.GetLength());
::ReleaseDC(0,deskdc);
------------------------------------------------------
14 HWND thread_hwnd=Findwindow(NULL,"你要監(jiān)控的進(jìn)程窗體(用SPY++看)"),
if (thread_hwnd==NULL) 。。。。。。。。。。
else DWORD thread_id=GetWindowThreadProcessId(thread_hwnd,NULL)
15 waveOutGetVolume()可以得到波形音量大小
16 隱藏桌面圖標(biāo)并禁用右鍵功能菜單:
------------------------------------
HWND Hwd = ::FindWindow("Progman", NULL);
if (bShowed)
::ShowWindow(Hwd, SW_HIDE);
else
::ShowWindow(Hwd, SW_SHOW);
bShowed = !bShowed;
---------------------------------------
18 KeyboardProc的lParam中包含著許多按鍵信息,其中第31位(從0開始)為0表示是按下按鍵,為1表示松開按鍵。
(lParam & 0x80000000)進(jìn)行二進(jìn)制'與'計(jì)算,效果是取第31位的值。
(lParam & 0x40000000)是取第30位,30位表示按鍵的上一個(gè)狀態(tài),為1表示之前鍵已經(jīng)是按下的,0表示松開。
lParam
[in] Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag. For more information about the lParam parameter, see Keystroke Message Flags. This parameter can be one or more of the following values.
0-15
Specifies the repeat count. The value is the number of times the keystroke is repeated as a result of the user's holding down the key.
16-23
Specifies the scan code. The value depends on the OEM.
24
Specifies whether the key is an extended key, such as a function key or a key on the numeric keypad. The value is 1 if the key is an extended key; otherwise, it is 0.
25-28
Reserved.
29
Specifies the context code. The value is 1 if the ALT key is down; otherwise, it is 0.
30
Specifies the previous key state. The value is 1 if the key is down before the message is sent; it is 0 if the key is up.
31
Specifies the transition state. The value is 0 if the key is being pressed and 1 if it is being released.
19 復(fù)制文件應(yīng)該用到CopyFile或是CopyFileEx這兩個(gè)API
20 移動(dòng)窗口的位置或改變大小:MoveWindow/SetWindowPos
21 我的程序是當(dāng)前運(yùn)行的程序時(shí),可以用setcursor()來設(shè)置光標(biāo)的圖標(biāo)。
而且可以用setcapture()是鼠標(biāo)移動(dòng)到我得程序窗口之外時(shí)也是我設(shè)置的圖標(biāo)
但是如果我得程序不是當(dāng)前的運(yùn)行程序的,鼠標(biāo)就會(huì)變會(huì)默認(rèn)的。
怎樣能夠,使得不變回默認(rèn)的,還是用我設(shè)置的光標(biāo)?
SetSystemCursor
22 SendMessage函數(shù)的幾個(gè)用法:
控制按鈕按下的,是這么用的
SendMessage(n1, WM_COMMAND, MAKELPARAM(ID,BN_CLICKED),(LPARAM )n2); (n1,n2是句柄)
而得到文本內(nèi)容,是這樣用的,
SendMessage(hWnd,WM_GETTEXT,10,(LPARAM)buf),
23 處理一個(gè)單行EDIT的WM_CTLCOLOR要同時(shí)響應(yīng)nCtlColor = CTLCOLOR_EDIT和CTLCOLOR_MSGBOX的兩個(gè)情況,參考http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_cwnd.3a3a.onctlcolor.asp
25 把字符"abc\n123"存入文本文件中時(shí),文件內(nèi)容沒看見換行,其實(shí)用word打開該文件是有換行的。另外用"abc\r\n123"代替也可看見換行。
26 ::SetFocus(::GetDesktopWindow());或::BringWindowToTop(::GetDesktopWindow());
::GetDesktopWindow()這里可獲得桌面窗口的句柄
28 SHGetFileInfo函數(shù)可獲得文件信息。
29 創(chuàng)建一個(gè)控件:
HWND hEdit=CreateWindow("EDIT",NULL,WS_CHILD|WS_VISIBLE |ES_LEFT,50,20,50,20,hwnd,NULL,hInst,NULL); //hwnd參數(shù)為父窗口句柄
30 VC中對聲音文件的操作:http://www.pujiwang.com/twice/Article_Print.asp?ArticleID=550
31 調(diào)用其它程序又要隱藏窗口:用CreateProcess函數(shù)調(diào)用,再拿到窗口句柄,然后::ShowWindow(hWnd,SW_HIDE);
32 讀取文本文件中的一行:
用CFile類的派生類:CStdioFile的方法:CStdioFile::ReadString
33 刪除非空文件夾:
------------------------------------------------
SHFILEOPSTRUCT shfileop;
shfileop.hwnd = NULL;
shfileop.wFunc = FO_DELETE ;
shfileop.fFlags = FOF_SILENT|FOF_NOCONFIRMATION;
shfileop.pFrom = "c:\\temp"; //要?jiǎng)h除的文件夾
shfileop.pTo = "";
shfileop.lpszProgressTitle = "";
shfileop.fAnyOperationsAborted = TRUE;
int nOK = SHFileOperation(&shfileop);
-------------------------------------------------
34 函數(shù)前面加上::是什么意思?
叫域運(yùn)算符...在MFC中表示調(diào)用API...或其它全局函數(shù)...為了區(qū)分是mfc函數(shù)還是api
詳見:http://search.csdn.net/Expert/topic/1183/1183492.xml?temp=.9471247
35 CImageList的用法:http://www.study888.com/computer/pro/vc/desktop/200506/39027.html
36 有關(guān)控件的一些常見問答:
http://fxstudio.nease.net/article/ocx/ <==========================很不錯(cuò)的地方哦
37 在多文檔客戶區(qū)中增加位圖底圖演示程序:
http://www.study888.com/computer/pro/vc/desktop/200506/39028.html
我的對應(yīng)工程:AddBackgroundBitmap
38 用VC++6.0實(shí)現(xiàn)PC機(jī)與單片機(jī)之間串行通信
http://www.zahui.com/html/1/1710.htm
39 日期到字符串:
--------------------------------------------------
SYSTEMTIME sys;
GetSystemTime(&sys);
char str[100];
sprintf(str,"%d%d%d_%d%d%d",sys.wYear,sys.wMonth,sys.wDay,sys.wHour+8,sys.wMinute,sys.wSecond);
//這里的小時(shí)數(shù)注意它的0:00點(diǎn)是早上8:00,所以要加上8,因?yàn)檫@是格林威治時(shí)間,換成我國時(shí)區(qū)要加8
--------------------------------------------------
CString m_strTemp;
SYSTEMTIME systemtime;
GetLocalTime(&systemtime); //這個(gè)函數(shù)可獲得毫秒級的當(dāng)前時(shí)間
m_strTemp.Format("%d年%d月%d日%d:%d:%d:%d 星期%d",systemtime.wYear,systemtime.wMonth,systemtime.wDay,systemtime.wHour,systemtime.wMinute,systemtime.wSecond,systemtime.wMilliseconds,systemtime.wDayOfWeek);
--------------------------------------------------
40 任務(wù)欄上的圖標(biāo)閃爍:
The FlashWindow function flashes the specified window once, whereas the FlashWindowEx function flashes a specified number of times.
BOOL FlashWindow(
HWND hWnd, // handle to window to flash
BOOL bInvert // flash status
);//閃爍一次
FlashWindowEx()//閃爍多次
41 十六進(jìn)制字符轉(zhuǎn)浮點(diǎn)數(shù):http://community.csdn.net/Expert/topic/4379/4379713.xml?temp=.7092096
long lValue = 0xB28A43;
float fValue;
memcpy(&fValue,&lValue,sizeof(float));
42 在一個(gè)由漢字組成的字符串里,由于一個(gè)漢字由兩個(gè)字節(jié)組成,怎樣判斷其中一個(gè)字節(jié)是漢字的第一個(gè)字節(jié),還是第二個(gè)字節(jié),使用IsDBCSLeadByte函數(shù)能夠判斷一個(gè)字符是否是雙字的第一個(gè)字節(jié),試試看:)
_ismbslead
_ismbstrail
43 如何實(shí)現(xiàn)對話框面板上的控件隨著對話框大小變化自動(dòng)調(diào)整
在OnSize中依其比例用MoveWindow同等縮放.http://www.codeproject.com/dialog/dlgresizearticle.asp
44 向CListCtrl中插入數(shù)據(jù)后,它總是先縱向再橫向顯示,我希望他先橫向再縱向
在CListCtrl的ReDraw()中處理(見http://community.csdn.net/Expert/topic/4383/4383963.xml?temp=.3442041)
如:
m_list.ReDraw(FALSE);
m_list.ReDraw(TRUE);
45 給你的程序加上splash:http://www.vckbase.com/document/finddoc.asp?keyword=splash
如何添加閃屏:Project->Add to Project->Components and Controls->Gallery\\Visual C++ Components->Splash screen
46 實(shí)現(xiàn)象快速啟動(dòng)欄的"顯示/隱藏桌面"一樣的功能:http://fxstudio.nease.net/article/form/55.txt
47 如何設(shè)置listview某行的顏色:
CSDN上的貼子:http://community.csdn.net/Expert/topic/4386/4386904.xml?temp=2.422512E-03
Codeguru上相關(guān)鏈接:http://www.codeguru.com/Cpp/controls/listview/backgroundcolorandimage/article.php/c1093/
48 如何得到窗口標(biāo)題欄尺寸:http://community.csdn.net/Expert/topic/4387/4387830.xml?temp=.6934168
GetSystemMetrics(SM_CYCAPTION或者SM_CYSMCAPTION);
SM_CYCAPTION Height of a caption area, in pixels.
SM_CYSMCAPTION Height of a small caption, in pixels.
--------------------------------------------------------
GetWindowRect(&rect);
rect.bottom = rect.top + GetSystemMetrics(SM_CYSIZE) + 3;
--------------------------------------------------------
49 如何將16進(jìn)制的byte轉(zhuǎn)成CString:
---------------------------------
BYTE p[3];
p[0]=0x01;
p[1]=0x02;
p[2]=0x12;
CString str;
str.Format("%02x%02x%02x", p[0], p[1], p[2]);
-------------------------------------
50 怎樣查找到正處在鼠標(biāo)下面的窗口(具體到子窗口和菜單),無論是這個(gè)窗口是否具有焦點(diǎn):
-----------------------------------------------------------
POINT pt;
CWnd* hWnd; // Find out which window owns the cursor
GetCursorPos(&pt);
hWnd=CWnd::WindowFromPoint(pt);
if(hWnd==this)
{
//鼠標(biāo)在窗體中空白處,即不在任何控件或子窗口當(dāng)中
}
51 得到CListCtrl控件點(diǎn)擊事件時(shí)點(diǎn)擊的位置:
-----------------------------------------------
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem != -1)
{
CString strtemp;
strtemp.Format("單擊的是第%d行第%d列",
pNMListView->iItem, pNMListView->iSubItem);
AfxMessageBox(strtemp);
}
*pResult = 0;
}
------------------------------------------------
52 如何在clistctrl的單元格里添加圖片?http://community.csdn.net/Expert/topic/4388/4388748.xml?temp=.2233393
53 自己處理按鍵響應(yīng)函數(shù):
-------------------------------------------------
BOOL CTest6Dlg::PreTranslateMessage(MSG* pMsg)
{
if( pMsg->message == WM_KEYDOWN )
{
if(pMsg->hwnd == GetDlgItem(IDC_EDIT1)->m_hWnd) //判斷當(dāng)前控件是不是編輯框
{
switch( pMsg->wParam )
{
case VK_RETURN: //如果是回車鍵的話
Onbutton1(); //就調(diào)用Button1的響應(yīng)函數(shù)
}
}
return CDialog::PreTranslateMessage(pMsg);
}
---------------------------------------------------
54 如何在VC中操縱word:http://www.vckbase.com/document/viewdoc/?id=1174
55 兩個(gè)像素(用RGB表示)如何確定亮度等級:
加權(quán)算出灰度值:R*0.21+Green*0.70+Blue*0.09,或:
((紅色值 X 299) + (綠色值 X 587) + (藍(lán)色值 X 114)) / 1000
56 對已畫在CDC上的圖片進(jìn)行處理,實(shí)現(xiàn)任意比例的透明度。
MSDN:http://msdn.microsoft.com/msdnmag/issues/05/12/CatWork/
實(shí)現(xiàn)方法是:
1、用GetCurrentBitmap得到DC上的CBitmap指針;
2、用GetBitmapBits得到CBitmap上的圖像數(shù)據(jù)流;
3、對圖像數(shù)據(jù)流中每個(gè)字節(jié)進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換的公式為
pBits[i] += (255 - pBits[i]) * nTransparent / 100;//nTransparent為透明度的百分率
57 MFC很多API函數(shù)的源代碼都在:VC安裝目錄\VC98\MFC\SCR\WINCORE.cpp文件中。
58 自己寫了個(gè)函數(shù),用來獲得ANSI字符串中真實(shí)字符的個(gè)數(shù),如“I服了U”的長度返回4:
--------------------------------------------------
int GetCount(CString str)
{
int total=0;
for(int i=0;i {
if (127<(unsigned int)str.GetAt(i))
{
total++;
i++;
}
else
total++;
}
return total;
}
----------------------------------------------------
59 消息傳遞中pMSG中一些參數(shù)的意義:
hwnd-------接收消息的窗口句柄;
message----發(fā)送的消息號;
wParam-----消息參數(shù),具體意義同發(fā)送的消息有關(guān);
lParam-----同上;
time-------發(fā)送消息時(shí)的時(shí)間,數(shù)值大小為自系統(tǒng)啟動(dòng)以來經(jīng)歷的時(shí)間,單位是毫秒;
pt---------發(fā)送消息時(shí)鼠標(biāo)在屏幕上的絕對坐標(biāo),單位是像素。
60 刷新屏幕局部:
刷新控件區(qū)域:
控件ID:IDC_STATIC_STATIC
------------------------------------
CRect static_rect;
CWnd *pwnd = GetDlgItem(IDC_STATIC_STATIC);
if (pwnd == NULL)
{
return;
}
pwnd->GetWindowRect(&static_rect);
ScreenToClient(&static_rect);
InvalidateRect(&static_rect); //注意這個(gè)函數(shù),會(huì)調(diào)用OnEraseBkgnd
--------------------------------------
61 VC實(shí)現(xiàn)錄音,放音,保存,打開功能: http://www.pconline.com.cn/pcedu/empolder/gj/vc/0412/509819.html
62 獲得任務(wù)欄高度:
----------------------------------
HWND hWnd = FindWindow("Shell_TrayWnd", NULL);
RECT rc;
::GetWindowRect(hWnd, &rc);
int iHeight = rc.bottom -rc.top;
-----------------------------------
63 vc控制word、excel的問題:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnoxpta/html/vsofficedev.asp
下面還有范例兩個(gè):
http://www.vckbase.com/code/downcode.asp?id=2415
http://www.vckbase.com/code/downcode.asp?id=2397
64 給ListBox控件加上水平滾動(dòng)條:m_list.SetHorizontalExtent(100); //m_list為和listbox控件綁定的CListBox變量
65 下拉式的工具條按鈕:http://community.csdn.net/Expert/topic/4413/4413094.xml?temp=.2334864
66 如何讓MFC基于Dialog的程序在任務(wù)欄中顯示:http://community.csdn.net/Expert/topic/4413/4413492.xml?temp=.3407404
67 制作一個(gè)沒有標(biāo)題欄.菜單欄和工具欄的視窗,就象游戲界面一樣:
http://community.csdn.net/Expert/topic/4396/4396239.xml?temp=.568783
68 為何組合框Droplist風(fēng)格時(shí)響應(yīng)鍵盤PreTranslateMessage函數(shù),而dropdown風(fēng)格時(shí)不響應(yīng):
http://community.csdn.net/Expert/topic/4412/4412791.xml?temp=.8741419
69 直接用特殊字符的編碼:s=WCHAR(0x00e6); //還沒試過
70 在標(biāo)題欄上畫圖:http://community.csdn.net/Expert/topic/4416/4416434.xml?temp=.8910944
71 如何精確延時(shí):http://www.vckbase.com/document/viewdoc/?id=1301
72 怎樣給TreeView控件中的結(jié)點(diǎn)重命名:http://community.csdn.net/Expert/topic/4409/4409069.xml?temp=.1730463
73 從內(nèi)存中加載并啟動(dòng)一個(gè)exe :http://community.csdn.net/Expert/topic/4418/4418306.xml?temp=.7619135
74 修改一個(gè)EXE的資源:http://community.csdn.net/Expert/topic/4420/4420755.xml?temp=.5104029
75 使用并顯示64bit數(shù)值的方法:
__int64 ld = 2000000000*4500000000; //64bit數(shù)的范圍:-9223372036854775808~+9223372036854775807
printf("%I64d\n",ld);
76 在程序中使用console窗口顯示:http://www.codeguru.com/Cpp/W-D/console/
在里面找一下:Redirection
77 用代碼畫鼠標(biāo)圖案并限定鼠標(biāo)移動(dòng)區(qū)域(用ClipCursor函數(shù)):
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/cursors/usingcursors.asp
79 bmp圖片怎么轉(zhuǎn)換為jpg:
用cximage www.codeproject.com上有
80 字符串轉(zhuǎn)成UTF-8格式參考CSDN上的FAQ:http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=191432
81 將16進(jìn)制字符串轉(zhuǎn)換成10進(jìn)制整數(shù):
char a[3]="ab";
DWORD val = strtoul(a, NULL, 16);
82 快速從數(shù)字的字符串中提取出特定長度的數(shù)字:
-------------------------------------------------------
int a[4];
sscanf("2004115819185","%07d%02d%02d%02d",&a[0],&a[1],&a[2],&a[3]); //按指定長度分隔
--------------------------------------------------------
或:
-------------------------------------------------------
CString s="aaa,bbb,ccc,ddd";
char a1[4],a2[4],a3[4],a4[4]; //這里要注意多留點(diǎn)空間以存放各子串的長度
sscanf(s,"%[^,],%[^,],%[^,],%[^,]",a1,a2,a3,a4); //按指定字符(這里是逗號)分隔
AfxMessageBox(a4);//顯示ddd
-------------------------------------------------------
85 根據(jù)ComboBox加入的字符串的長度自動(dòng)調(diào)整ComboBox控件的寬度:
//這里假設(shè)為ComboBox加入兩個(gè)字符串
CString str1="中華人民共和國中華人民共和國",str2="1234567890123中國89012345678";
m_combo.AddString(str1); //m_combo為綁定在組合框控件的變量
m_combo.AddString(str2);
int len=str1.GetLength()*6.2; //根據(jù)加入的字符串長度(以字節(jié)為單位)和組合框使用的默認(rèn)字體的大小計(jì)算組合框?qū)嶋H需要的寬度,計(jì)算中間用到了整數(shù)->浮點(diǎn)數(shù)->整數(shù)的兩次數(shù)值類型隱式轉(zhuǎn)換,也可以用winAPI函數(shù)GetTextExtentPoint32()或GetTextExtent計(jì)算
m_combo.SetDroppedWidth(len);
86 彈出U盤:http://community.csdn.net/Expert/topic/4432/4432968.xml?temp=.8724634
87 往另一個(gè)程序的編輯框中發(fā)送文字:句柄->SendMessage(WM_SETTEXT,strlen(buf),(LPARAM)buf); //buf為你要加入的char*
88 如何在RichEdit中加超鏈接:http://community.csdn.net/Expert/topic/4434/4434686.xml?temp=9.524173E-02
89 VC控件的用法:http://www.vckbase.com/document/indexold.html
91 在初始時(shí)候定位到LIST的指定行(如第100行)開始顯示:EnsureVisible(100) //未驗(yàn)證
92 如何在app中SetTimer():http://community.csdn.net/Expert/topic/4437/4437002.xml?temp=6.014651E-02
93 一個(gè)基于SDK的軟鍵盤的范例,可以學(xué)習(xí)如何發(fā)送虛擬按鍵或鼠標(biāo)消息:http://www.codeproject.com/cpp/togglekeys.asp
94 MDI文檔中的字體、及其顏色怎么設(shè)置:http://community.csdn.net/Expert/topic/4396/4396003.xml?temp=.7866938
95 自己捕捉特定的組合鍵:http://community.csdn.net/Expert/topic/4439/4439270.xml?temp=.7411157
http://community.csdn.net/Expert/topic/4484/4484120.xml?temp=.3993799
--------------------------------------------------------------
BOOL CMMDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
BOOL b = GetAsyncKeyState(VK_CONTROL) >> ((sizeof(short) * 8)-1);
if(b)
{
b = GetAsyncKeyState(VK_MENU) >> ((sizeof(short) * 8)-1);
if(b)
{
b = GetAsyncKeyState(65) >> ((sizeof(short) * 8)-1); //這里不分大小寫
if(b)
{
AfxMessageBox("你按下了Ctrl+Alt+A組合鍵。") ;
}
}
}
return CDialog::PreTranslateMessage(pMsg);
}
另外,GetAsyncKeyState和::GetKeyState這兩個(gè)函數(shù)也可以幫你檢測Shift、Ctrl和Alt這些鍵的狀態(tài)。
96 快速從得到的全路徑文件名中分離出盤符、路徑名、文件名和后綴名:
------------------------------------------------
char path_buffer[_MAX_PATH];
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
GetModuleFileName(0,path_buffer,_MAX_PATH);
_splitpath( path_buffer, drive, dir,fname , ext); //用這個(gè)函數(shù)轉(zhuǎn)換
------------------------------------------------
97 如何debug除零錯(cuò)誤:http://community.csdn.net/Expert/topic/4440/4440273.xml?temp=.2427484
99 在窗口的標(biāo)題欄和菜單欄上象realplayer那樣添加自己的logo:http://www.codeproject.com/menu/menuicon.asp
100 個(gè)性化的位圖菜單,自己從CMenu派生子類實(shí)現(xiàn):http://www.codeguru.com/Cpp/controls/menu/bitmappedmenus/article.php/c165
http://www.codeguru.com/Cpp/controls/menu/bitmappedmenus/article.php/c163
101 怎樣取得程序自己占用的內(nèi)存和CPU占用率:GetProcessMemoryInfo和GetPerformanceInfo
102 如何讓你的程序運(yùn)行在release模式下:build->set active configuration
103 監(jiān)視文件夾是否被更新:FindFirstChangeNotification、FindNextChangeNotification、FindCloseChangeNotification這三個(gè)函數(shù)
范例見:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/obtaining_directory_change_notifications.asp
105 動(dòng)態(tài)菜單:http://community.csdn.net/Expert/topic/4441/4441893.xml?temp=.2887384
http://community.csdn.net/Expert/topic/4506/4506791.xml?temp=.2409326
106 如何獲取客戶區(qū)的中心坐標(biāo):http://community.csdn.net/Expert/topic/4449/4449444.xml?temp=8.642215E-02
107 強(qiáng)行操作內(nèi)存虛擬地址中某個(gè)指定地方的內(nèi)容:
----------------------------------------------
int *a=(int*)0x00440000; //這里以訪問0x00440000地址為例
cout<<*a< ----------------------------------------------
108 如何響應(yīng)條碼機(jī):http://community.csdn.net/Expert/topic/4453/4453026.xml?temp=.1966516
條碼掃描儀主要有三種接口: 1.RS232 2.共用接盤接口 3.USB外設(shè). 對于RS232,需要編程來監(jiān)視和讀取條碼; 對于共用接盤接口,條碼信息被轉(zhuǎn)換成相應(yīng)的鍵盤消息,具有輸入焦點(diǎn)的應(yīng)用程序會(huì)收到鍵盤輸入消息,我們以前的做法是做一個(gè)全局keyboard Hook或應(yīng)用程序級別上 keyboard hook, 監(jiān)視鍵盤消息,當(dāng)有連續(xù)的鍵盤消息(在很短的時(shí)間內(nèi)),并且這些鍵盤字符能構(gòu)成完成的條碼信息,就產(chǎn)生一條自定義消息,通知窗口(向監(jiān)視程序注冊的窗口)條碼信息到達(dá),條碼機(jī)只是相當(dāng)于一個(gè)鍵盤,所以你也可以在界面上放一個(gè)edit框,條碼機(jī)讀出條碼后還會(huì)在字符串后面加一個(gè)回車(這個(gè)一般是可設(shè)置的,可加可不加),如果條碼機(jī)自動(dòng)加回車,則你重寫OnOK函數(shù),將edit框的內(nèi)容取出放入list即可。
當(dāng)然也可不放edit框,而直接接收鍵盤字符(比如重寫OnChar函數(shù)等,方法很多),但要考慮到這種情況:條碼讀不出來的情況,此時(shí)應(yīng)該用手動(dòng)輸入條碼,所以還是放一個(gè)edit框?yàn)楹谩?/p>
109 檢查指定文件夾是否存在:PathIsDirectory()
方法一:
檢查給定路徑是否根目錄:BOOL PathIsRoot(LPCTSTR pPath);
說明:Returns TRUE for paths such as “\”, “ X:\”, “\\ server\ share”, or “\\ server\”。Paths such as “..\path2” will return FALSE.
用這兩個(gè)函數(shù)要先:#include ;
再把這個(gè)文件加入工程:shlwapi.lib
方法二:
GetFileAttributes檢查文件是否存在,并且檢查是否文件夾屬性FILE_ATTRIBUTE_DIRECTORY
----------------------------------------------------------
DWORD = GetFileAttributes(_T("f:\\win98"));
if(dwAttr != 0xFFFFFFFF && (dwAttr & FILE_ATTRIBUTE_DIRECTORY))
cout<<"exist"< else
cout<<"NOT exist"< ----------------------------------------------------------
方法三:
用下面第113條的_access函數(shù)同樣可以
----------------------------------------------------------
if(_access("f:\\win98",0)!=-1)
cout<<"exist"< else
cout<<"NOT exist"< ----------------------------------------------------------
方法四:
用PathFileExists函數(shù),見MSDN介紹,需要的條件同方法一。
還有一個(gè):BOOL SHGetPathFromIDList(LPCITEMIDLIST pidl,LPTSTR pszPath);
Converts an item identifier list to a file system path.
110 去掉單文檔標(biāo)題欄上的“無標(biāo)題—”:http://community.csdn.net/Expert/topic/4454/4454093.xml?temp=.2896997
111 打開顯示器: ::SendMessage(GetSafeHwnd(), WM_SYSCOMMAND, SC_MONITORPOWER, -1); //從bobob的blog上抄來的^_^
關(guān)閉顯示器: ::SendMessage(GetSafeHwnd(), WM_SYSCOMMAND, SC_MONITORPOWER, 1); //從bobob的blog上抄來的^_^
得到它的工作狀態(tài):
休眠狀態(tài)是指用SendMessage(Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1)關(guān)閉的
112 得到系統(tǒng)時(shí)間、語言等的設(shè)置
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ITIME, lpLCData, cchData); //從bobob的blog上抄來的^_^
113 文件是否存在(記得先包含頭文件#include )
----------------------------------
if(_access("c:\\somefile.txt",0)!=-1)
//存在
else
//不存在
---------------------------------
還有一個(gè)方法:
---------------------------------------------
if(GetFileAttributes("f:\\test.txt")!=0xFFFFFFFF)
{
//存在
}
else
{
//不存在
}
---------------------------------------------
114 得到剪貼板數(shù)據(jù)
-------------------------------------------------
if ( OpenClipboard() )
{
HANDLE hData = GetClipboardData(CF_TEXT);
char * buffer = (char*)GlobalLock(hData); //剪貼板中的文本內(nèi)容保存在buffer中
GlobalUnlock(hData);
CloseClipboard();
}
----------------------------------------------
115 在CStatic上面關(guān)聯(lián)圖片
----------------------------------------------
CStatic* pWnd = (CStatic*)GetDlgItem(IDC_STATIC);
pWnd->ModifyStyle(0, SS_BITMAP);
pWnd->SetBitmap((HBITMAP)::LoadImage(0,
"c:\\zzzzz.bmp", //只能顯示.bmp文件
IMAGE_BITMAP,
0,0,LR_CREATEDIBSECTION |LR_DEFAULTSIZE |LR_LOADFROMFILE));
----------------------------------------------
116 顯示一個(gè)打開文件夾的對話框,并得到用戶選擇的目錄:
-------------------------------------------
char szDir[MAX_PATH];
BROWSEINFO bi;
ITEMIDLIST *pidl;
bi.hwndOwner = this->m_hWnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = szDir;
bi.lpszTitle = "請選擇目錄";//strDlgTitle;
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lpfn = NULL;
bi.lParam = 0;
bi.iImage = 0;
pidl = SHBrowseForFolder(&bi);
if(pidl == NULL)
return;
if(!SHGetPathFromIDList(pidl, szDir))
return;
AfxMessageBox(szDir); //szDir中存放的內(nèi)容為用戶選定的目錄
------------------------------------------------
117 去除字符串中指定的字符:
-----------------------------------------
CString strtemp;
strtemp.Format("%s","abc\n123\ndef");
strtemp.Remove('\n'); //這里以去除換行符為例,結(jié)果保存在strtemp中了
-------------------------------------------
119 假如當(dāng)前時(shí)間2005-09-09,如何計(jì)算在該時(shí)間前12345天,是哪年哪月哪日?
---------------------------
CTime tm(2005,9,9,0,0,0);
tm-=86400*12345;
cout< ----------------------------
120 PeekMessage是干什么用的: http://community.csdn.net/Expert/topic/4462/4462828.xml?temp=.8852045
121 拖動(dòng)控件時(shí)實(shí)現(xiàn)類似windows拖動(dòng)窗口的效果:CRectTracker
Mackz朋友的blog中有它的范例:http://blog.csdn.net/Mackz/archive/2005/10/27/517747.aspx
122 有關(guān)UNICODE、ANSI字符集和相關(guān)字符串操作的總結(jié):http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=199372
123 尋找系統(tǒng)中的打印機(jī):EnumPrinters
126 winAPI 函數(shù)GetTextExtentPoint32()可以得出一個(gè)以像素為單位的字符串的寬度。
127 RGB轉(zhuǎn)換成YV12(YUV 4:2:0)的方法:http://www.fourcc.org/fccyvrgb.php
128 獲得指定進(jìn)程占用內(nèi)存的情況,用GetProcessMemoryInfo()函數(shù)。
129 把CONSOLE程序的輸出導(dǎo)入到文件中,用程序控制:http://community.csdn.net/Expert/topic/4403/4403431.xml?temp=.7469599
131 MFC中使用ATL字符轉(zhuǎn)換宏:在你的函數(shù)開關(guān)加上USES_CONVERSION;語句,詳見MSDN或這里:http://community.csdn.net/Expert/topic/4479/4479609.xml?temp=.6256983
132 如何建立共享目錄:直接調(diào)用標(biāo)準(zhǔn)的Win32API函數(shù)NetShareAdd和NetShareDel
詳見MSDN及:http://community.csdn.net/Expert/topic/4481/4481371.xml?temp=.4405023
135 Menu系列函數(shù):
GetMenu
GetMenuInfo
GetMenuItemCount
GetMenuItemID
GetMenuString
EnableMenuItem
CheckMenuItem
ModifyMenu
RemoveMenu
InsertMenu
GetSystemMenu
::LoadMenu
::SetMenu
136 得到SYSTEMMENU(系統(tǒng)菜單)的高度:GetSystemMetrics(SM_CYMENU);
得到當(dāng)前屏幕分辨率:
GetSystemMetrics(SM_CXFULLSCREEN); //得x值(如1024)
GetSystemMetrics(SM_CYFULLSCREEN); //得y值( 如768-任務(wù)欄高度)
此外這個(gè)函數(shù)還可以得到很多別的系統(tǒng)設(shè)置值,詳見MSDN:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getsystemmetrics.asp
137 在屬性頁控件的標(biāo)簽上加圖片:http://www.codeguru.com/cpp/controls/propertysheet/article.php/c611/ BOOL CMyPropSheet::OnInitDialog()
{
BOOL bResult = CPropertySheet::OnInitDialog();
m_imageTab.Create( IDB_TABIMAGES, 13, 1, RGB(255,255,255) );
CTabCtrl *pTab = GetTabControl();
pTab->SetImageList( &m_imageTab );
TC_ITEM tcItem;
tcItem.mask = TCIF_IMAGE;
for( int i = 0; i < 3; i++ )
{
tcItem.iImage = i;
pTab->SetItem( i, &tcItem );
}
return bResult;
}
----------------------------------------------------
138 這里有很多CRichEditCtrl控件的高級用法:http://www.codeguru.com/Cpp/controls/richedit/
139 CGridCtrl控件的一些應(yīng)用:http://www.vckbase.com/code/listcode.asp?mclsid=3&sclsid=327
140 一個(gè)不錯(cuò)的地方:http://www.vckbase.com/document/listdoc.asp?mclsid=3&sclsid=323
141 怎樣使右鍵菜單也能變灰、打勾:http://community.csdn.net/Expert/topic/4501/4501123.xml?temp=.4074823
142 MD5加密解密的API:http://community.csdn.net/Expert/topic/4502/4502325.xml?temp=.6894647
MD5Init MD5Final MD5Update
143 用CBrush::CreateStockObject(HOLLOW_BRUSH);或CBrush::CreateStockObject(NULL_BRUSH);這兩個(gè)可以創(chuàng)建鏤空的畫刷。
144 創(chuàng)建不規(guī)則窗體:http://www.vckbase.com/document/viewdoc/?id=1345
145 拖動(dòng)一個(gè)沒有標(biāo)題欄的窗體:http://community.csdn.net/Expert/topic/4499/4499796.xml?temp=6.763858E-02
146 屏蔽瀏覽器中的彈出廣告,下面地址中是在ATL中采用BHO服務(wù)的方法:http://www.codeproject.com/atl/popupblocker2.asp
CSDN上有個(gè)討論貼:http://community.csdn.net/Expert/topic/4496/4496918.xml?temp=.157284
147 遠(yuǎn)程線程注入:
http://www.codeproject.com/threads/RmThread.asp
http://www.codeproject.com/library/InjLib.asp
http://www.codeproject.com/win32/Remote.asp
148 CEditView中兩個(gè)函數(shù)的用法:
GetEditCtrl().ModifyStyle (0 , WS_VSCROLL |ES_AUTOHSCROLL |ES_AUTOVSCROLL |WS_HSCROLL |ES_WANTRETURN | ES_MULTILINE);
GetEditCtrl().GetSel(m_nStartChar, m_nEndChar ) ;
149 給對話框窗體底部加上狀態(tài)條,把下面代碼加進(jìn)對話框的OnInitDialog()函數(shù)中:
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
//下面m_wndStatusBar必須先在對話框類中聲明:CStatusBar m_wndStatusBar;
if (!m_wndStatusBar.Create(this,WS_CHILD|WS_VISIBLE|WS_BORDER)||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{ AfxMessageBox("Status Bar not created!", NULL, MB_OK ); }
CRect rect;
this->GetWindowRect(&rect);
m_wndStatusBar.MoveWindow(2,rect.bottom-GetSystemMetrics(SM_CYSIZE)-27,rect.Width()-4,20);
m_wndStatusBar.ShowWindow(SW_SHOW);
m_wndStatusBar.SetWindowText("Ready");
把上面代碼加在OnInitDialog里,注意:m_wndStatusBar變量的聲明語句CStatusBar m_wndStatusBar;要放在你的對話框類C****Dlg中才行。
150 從注冊表中讀取cpu的頻率:
讀取 ~MHz 這個(gè)鍵值 ,記住那鍵前有個(gè)~別忘了,在注冊表的HKEY_LOCAL_MACHINE\\Hardware\\Description\\System\\CentralProcessor\\0 //0 為第一個(gè)cpu
Hardware\\Description\\System\\CentralProcessor\\1 //1 為第二個(gè)cpu
得到cpu的數(shù)量,摘自:http://community.csdn.net/Expert/topic/4635/4635246.xml?temp=.7182123
SYSTEM_INFO siSysInfo;
GetSystemInfo(&siSysInfo);
printf(" Number of processors: %u\n", siSysInfo.dwNumberOfProcessors);
151 改變CStatic控件的前景、背景色:http://community.csdn.net/Expert/topic/4507/4507710.xml?temp=.1524164
處理WM_CTLCOLOR消息:
---------------------------------------------------------------------
HBRUSH CQQDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr;
// TODO: Change any attributes of the DC here
if(CTLCOLOR_STATIC == nCtlColor)
//if(CTLCOLOR_STATIC == nCtlColor && pWnd->GetDlgCtrlID()==IDC_TOOL) //改成這樣就只對IDC_TOOL這一個(gè)靜態(tài)文本控件起作用了
{
pDC->SetBkColor(RGB(255,255,255)); //背景色為白
pDC->SetTextColor(RGB(0,0,0)); //前景色為黑
hbr = CreateSolidBrush(RGB(255,255,255)); //其它區(qū)域也為白
//上面三行代碼改成下面這三行就創(chuàng)建空心刷子,就可以實(shí)現(xiàn)在背景上寫字的效果了
//pDC->SetBkMode(TRANSPARENT);
//pDC->SetTextColor(RGB(0,0,0));
//hbr = CreateStockObject(NULL_BRUSH);
}
else
hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Return a different brush if the default is not desired
return hbr;
}
----------------------------------------------------------------------
再加一個(gè)判斷if (pWnd->GetDlgCtrlID()==IDC_....)就可以指定是改變哪個(gè)的顏色了,其它控件的顏色的改變方法和這個(gè)大同小異。
154 我的程序知道一個(gè)應(yīng)用程序的句柄,如何使該應(yīng)用程序得到焦點(diǎn):http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=192872
if(::GetForegroundWindow()!=m_MainWnd)
::SetForegroundWindow(m_MainWnd);
::SetFocus( m_MainWnd);
或:
::ShowWindow(m_MainWnd, SW_SHOW);
::SetForegroundWindow(m_MainWnd);
------------------------------------
155 在對話框的標(biāo)題欄上添加按鈕:http://www.codeguru.com/Cpp/W-D/dislog/titlebar/article.php/c1897
156 判斷當(dāng)前線程的當(dāng)前輸入法是中文還是英文輸入法(至于到底是哪種中文輸入法我也不知道):
HKL hKl = GetKeyboardLayout(0); //這里0表示當(dāng)前線程,要查指定線程的話可以用指定線程的標(biāo)識符代替 if (ImmIsIME(hKl))
AfxMessageBox("當(dāng)前是中文輸入法。");
其它地區(qū)語言輸入法的信息在MSDN中搜索:Table of Language Identifiers
157 動(dòng)態(tài)創(chuàng)建靜態(tài)控件并加載.bmp圖片,先在對話框類中定義成員變量:
public:
CStatic m_pp; //這個(gè)是在對話框類中定義的
再:
CBitmap cb;
cb.LoadBitmap(IDB_BITMAP1);
m_pp.Create("",WS_CHILD|WS_VISIBLE|SS_BITMAP,CRect(10,10,200,200),this,101);
m_pp.SetBitmap((HBITMAP)cb);
----------------------------------------------------
158 DLL中創(chuàng)建窗口時(shí)對于資源等,需要先進(jìn)行狀態(tài)處理:AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
159 把圖片中某種指定色變成透明色,在對話框的OnPaint()中加入類似如下代碼:
//CImage imgOriginal;
int XWitdh=imgOriginal.GetWidth();
int XHeight=imgOriginal.GetHeight();
COLORREF TransparentColor= RGB(0x00,0x00,0x00); //這里黑色變成透明色
CPaintDC dc(this);
imgOriginal.TransparentBlt(dc.m_hDC,0,0,XWitdh,XHeight,TransparentColor);
imgOriginal.StretchBlt(dc,0,0,imgOriginal.GetWidth()/2,imgOriginal.GetHeight()/2,SRCCOPY);
-------------------------------------------------------------------------------
162 鼠標(biāo)左右鍵同時(shí)按下與鼠標(biāo)與鍵盤同時(shí)按下的識別:http://www.vckbase.com/article/misc/0017.htm
玩過Windows的掃雷游戲嗎?該游戲中就有一個(gè)同時(shí)按下鼠標(biāo)左右鍵的操作,其實(shí)對同時(shí)按下鼠標(biāo)左右鍵的判斷并不復(fù)雜,判斷方法與判斷鼠標(biāo)按鍵是否與Ctrl和Shift同時(shí)按下的方法相同,這里要用到鼠標(biāo)消息中的wparam項(xiàng),其中含有我們想要的幾個(gè)按鍵的狀態(tài)。定義如下:
(1)MK_CONTROL:Ctrl鍵按下時(shí)置1;
(2)MK_LBUTTON:鼠標(biāo)左鍵按下時(shí)置1;
(3)MK_MBUTTON:鼠標(biāo)中鍵按下時(shí)置1;
(4)MK_RBUTTON:鼠標(biāo)右鍵按下時(shí)置1;
(5)MK_SHIFT:Shift鍵按下時(shí)置1。
通過判斷這幾個(gè)標(biāo)志位可以得到同時(shí)按下的幾個(gè)鍵的狀態(tài),從而判斷是否有其它鍵同時(shí)按下。
166 讓編譯器忽略某種警告:
--------------------------------
#pragma warning (disable : 4101)
--------------------------------
上面的代碼加上后編譯器不會(huì)再出現(xiàn)warning C4101: 'i' : unreferenced local variable這樣的警告了。
167 枚舉網(wǎng)頁各個(gè)元素,參考:
http://www.vckbase.com/document/viewdoc/?id=288
http://www.vckbase.com/document/viewdoc/?id=1446
168 rundll32.exe,這個(gè)程序很方便,用它可以調(diào)用任何 DLL 中的函數(shù)。你只要給它提供 DLL、函數(shù)名以及要傳遞的參數(shù)即可。Rundll32.exe 絕對多才多藝,你可以用它來關(guān)閉和重啟 Windows,創(chuàng)建快捷方式以及啟動(dòng)控制面板程序。只要知道要調(diào)用的DLLs,一切都搞掂。你可以象下面這樣用 rundll32.exe 從命令行打開一個(gè) URL:
rundll32.exe url.dll,FileProtocolHandler www.vckbase.com
--------------------------------------------------------
url.dll 中的函數(shù) FileProtocolHandler 負(fù)責(zé)這個(gè)工作。
169 HDC===>CDC*
----------------------------------
HDC hdc=::GetWindowDC(this->m_hWnd); //獲得窗口標(biāo)題欄區(qū)域
CDC* pDC = CDC::FromHandle(hdc);
----------------------------------
CDC*===>HDC,可以通過CDC的操作符HDC()來實(shí)現(xiàn):
------------------
HDC hdc=HDC(pDC); //或:HDC hdc=pDC->m_hdc;
------------------
170 操作狀態(tài)欄,下面以在狀態(tài)欄中顯示鼠標(biāo)當(dāng)前坐標(biāo)為例,代碼如下:
-------------------------------------------------------------------------------------------
CMyView::OnMouseMove(UINT nFlag,CPoint point)
{
CClientDC dc(this);
CMainFrame *pFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd;
CStatusBar *pStatusBar = (CStatusBar *)&pFrame->m_wndStatusBar;
CString str;
str.Format("x:%d,y:%d",point.x,point.y);
CSize size = dc.GetTextExtent(str); //得到文本所需的大小尺寸
int nIndex = pStatusBar->CommandToIndex(ID_INDICATOR_MOUSEPOS);
pStatusBar->SetPaneInfo(nIndex,ID_INDICATOR_MOUSEPOS,SBPS_NORMAL,size.cx); //按文本所需的寬度設(shè)置狀態(tài)欄寬度
pStatusBar->SetPaneText(nIndex,str);
CView::OnMouseMove(nFlags, point);
}
-------------------------------------------------------------------------------------------
173 GetDeviceCaps,一個(gè)可得到很多關(guān)于指定設(shè)備的具體信息的函數(shù)
174 注冊表中:HKEY_CURRENT_USER\KeyboardLayout\preload分支下分別有輸入法對應(yīng)的1、2、3、4幾個(gè)主鍵,其鍵值一一對應(yīng)已安裝的輸入法,如:1的鍵值00000409是英文輸入法,知道具體輸入法和鍵值的對應(yīng)關(guān)系后,我們可以根據(jù)得到的鍵值判斷用戶的當(dāng)前輸入法了。
175 在托盤區(qū)處顯示氣泡提示:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/ifaces/iusernotification/SetBalloonInfo.asp
176 設(shè)置對話框的背景色的簡單方法,其實(shí)只要在CWinapp的InitInstance的里面添加一行代碼就行了:
BOOL CBOOKApp::InitInstance()
{
AfxEnableControlContainer();
SetDialogBkColor(RGB(213,240,227),RGB(173,7,95)); //添加這行,前者為背景色,后者為前景色
.....
}
---------------------------------------------------------
177 顯示gif動(dòng)畫表情的CRechEdit控件:http://lzzqqq.blogchina.com/2819759.html
178 單文檔程序,如何使程序窗口一開始就固定在某一尺寸:PreCreateWindow中指定大小.可以去掉框架窗口的WS_THICKFRAME風(fēng)格來使窗口不可改變大小,可以選擇性的去掉WS_MAXIMIZEBO風(fēng)格。也可以處理WM_GETMINMAXINFO消息來限制視圖的大小。
179 CSpinButtonCtrl:http://www.ruanxun.com/HArticle78020.aspx
180 限制用戶調(diào)整窗口的最大、最小尺寸,在窗口的WM_GETMINMAXINFO消息響應(yīng)函數(shù)中處理,如:
---------------------------------------------------------------------------
void CQQDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
// TODO: Add your message handler code here and/or call default
lpMMI->ptMinTrackSize.x=200; //限制最小寬度,單位為像素,下同
lpMMI->ptMinTrackSize.y=400; //限制最小高度
lpMMI->ptMaxTrackSize.x=250; //限制最大寬度
lpMMI->ptMaxTrackSize.y=500; //限制最大高度
CDialog::OnGetMinMaxInfo(lpMMI);
}
---------------------------------------------------------------------------
181 獲取桌面所有圖標(biāo)的標(biāo)題,代碼示范了如何使用VirtualAlloc(),WriteProcessMemory() 和 ReadProcessMemory() 在不同的進(jìn)程中分配內(nèi)存。用Windows的消息獲得圖標(biāo)的名稱:
下載源碼:http://www.vckbase.com/code/listcode.asp?mclsid=1&sclsid=101&page=6
182 一臺機(jī)器可能有不止一個(gè)CD-ROM驅(qū)動(dòng)器。現(xiàn)在CD-ROM已經(jīng)是PC機(jī)的標(biāo)準(zhǔn)配置,此外再裝個(gè)可擦寫的光盤驅(qū)動(dòng),甚至是DVD都是很常見的事情。不管一臺機(jī)器上裝多少個(gè)不同的驅(qū)動(dòng)器,如何找到它們呢?下載源碼:http://www.vckbase.com/code/listcode.asp?mclsid=1&sclsid=101&page=6
183 做一個(gè)類似文件快捷方式中查找目標(biāo)的功能,Net 2003中的MSDN,找到了可以實(shí)現(xiàn)該功能的API,SHOpenFolderAndSelectItems()函數(shù).....本程序可以調(diào)用Explore打開指定文件夾,并把指定文件置為選定狀態(tài),下載源碼:http://www.vckbase.com/code/listcode.asp?mclsid=1&sclsid=101
184 字符串轉(zhuǎn)為Unicode:
-----------------------------------------------------------------
WCHAR wsz[MAX_PATH];
CString str="字符串";
#ifdef _UNICODE
wcscpy(wsz, str); //如果工程支持Unicode的話用wcscpy函數(shù)
#else
//工程不支持的話用MultiByteToWideChar函數(shù)轉(zhuǎn)換
MultiByteToWideChar(CP_ACP, 0, str, -1, wsz, MAX_PATH);
#endif
-----------------------------------------------------------------
也可以用c的函數(shù)庫的函數(shù):
mbtowc 轉(zhuǎn)一個(gè)字符
mbstowcs 轉(zhuǎn)字符串
185 向一個(gè)進(jìn)程外窗口發(fā)送WM_SHOWWINDOW消息,隱藏或顯示該窗口:
HWND hwnd=::FindWindow(0,"ddd"); //隱藏"ddd"窗口
::PostMessage(hwnd,WM_SHOWWINDOW,FALSE,SW_OTHERZOOM); //參數(shù)3為FALSE時(shí)隱藏,為TRUE則顯示該窗口
上面代碼有可能失敗,因?yàn)閃M_SHOWWINDOW只是窗口準(zhǔn)備改變狀態(tài)時(shí),系統(tǒng)發(fā)出的消息,并不能控制窗口狀態(tài)的改變。另一個(gè)方法可以把后面一句改成:ShowWindow(hwnd,SW_HIDE);
186 使用24位色彩圖標(biāo)的工具條,有源碼范例的:http://www.codeguru.com/Cpp/controls/toolbar/article.php/c2537
187 設(shè)置CListCtrl控件圖標(biāo)間距離的方法:CListCtrl::SetIconSpacing
188 設(shè)置層疊窗口的透明色函數(shù):SetLayeredWindowAttributes,部分代碼參考:
SetWindowLong(this->m_hWnd,GWL_EXSTYLE,GetWindowLong(this->m_hWnd,GWL_EXSTYLE)|WS_EX_LAYERED);
HWND hWnd=this->m_hWnd;
typedef DWORD (WINAPI *PSLWA)(HWND, DWORD, BYTE, DWORD);
PSLWA pSetLayeredWindowAttributes;
HMODULE hDLL = LoadLibrary ("user32");
pSetLayeredWindowAttributes = (PSLWA) GetProcAddress(hDLL,"SetLayeredWindowAttributes");
if (pSetLayeredWindowAttributes != NULL)
{
pSetLayeredWindowAttributes (hWnd,0,20,LWA_ALPHA);
}
FreeLibrary(hDLL);
-------------------------------------------------------------------------
189 關(guān)于滾動(dòng)條方面的,GetScrollInfo獲得滾動(dòng)條位置信息:
------------------------------------
SCROLLINFO si;
ZeroMemory(&si, sizeof(si));
si.cbSize = sizeof(si);
si.fMask = SIF_TRACKPOS;
// Call GetScrollInfo to get current tracking position in si.nTrackPos
GetScrollInfo(hwnd, SB_HORZ, &si);
-----------------------------------
讓滾動(dòng)條滾動(dòng)需要發(fā)送相應(yīng)的WM_VSCROLL和WM_HSCROLL消息:
SendMessage (hwnd, WM_VSCROLL, SB_TOP, 0) ;
SetScrollInfo函數(shù)改變滾動(dòng)條的位置。
190 切換到軟鍵盤:call ImmSetConversionStatus with IME_CMODE_SOFTKBD
191 用SetVolumeLabel函數(shù)修改U盤卷標(biāo)時(shí)據(jù)說windows會(huì)刷新里面的內(nèi)容。 <===================還沒試
192 基于對話框的MFC程序想要具有打印功能:http://community.csdn.net/Expert/topic/4557/4557847.xml?temp=.5908472
193 打開那個(gè)標(biāo)題為"打開方式..."的對話框來選擇程序:WinExec("rundll32.exe shell32.dll,OpenAs_RunDLL path\filename",SW_RESTORE);
195 從立體聲的wave文件中分別提出左聲道和右聲道的聲音數(shù)據(jù),實(shí)現(xiàn)音頻文件的播放——單聲道錄音、立體聲錄音并保存為.wav文件,以及VC.NET簡單實(shí)現(xiàn)GIF動(dòng)畫:
http://www.vckbase.com/code/listcode.asp?mclsid=7
196 DirectX Input獲得鼠標(biāo)輸入:http://www.vckbase.com/code/listcode.asp?mclsid=7&sclsid=&page=2
197 數(shù)字水印算法的實(shí)現(xiàn):http://www.vckbase.com/code/listcode.asp?mclsid=7&sclsid=&page=3
198 程序如何加入全局熱鍵:RegisterHotKey注冊熱鍵,響應(yīng)WM_HOTKEY消息來截獲熱鍵:http://www.xiaozhou.net/cooldog/blogview.asp?logID=78
199 讀取其它進(jìn)程內(nèi)存中的數(shù)據(jù):ReadProcessMemory
200 給程序加上系統(tǒng)托盤圖標(biāo):http://www.vckbase.com/bbs/prime/viewprime.asp?id=260
下面是簡單的代碼:
NOTIFYICONDATA nid;
//初始化系統(tǒng)托盤圖標(biāo)
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = m_hWnd;
nid.uID = 100;
nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
nid.uCallbackMessage = WM_USER+20;
nid.hIcon=LoadIcon(NULL,IDI_APPLICATION); //圖標(biāo)
strcpy(nid.szTip, "My Tooltip Text"); //提示
Shell_NotifyIcon(NIM_ADD, &nid);
--------------------------------------------------------------
201 單文檔中打印預(yù)覽,發(fā)送消息模擬點(diǎn)擊菜單中“打印預(yù)覽”:
::SendMessage(this->GetSafeHwnd(), WM_COMMAND, ID_FILE_PRINT_PREVIEW, 0);
202 得到當(dāng)前登陸用戶的用戶名:GetUserName/GetUserNameEx
203 設(shè)置發(fā)生改變后系統(tǒng)會(huì)自動(dòng)更新,要善加利用:::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,NULL,NULL);
204 拖動(dòng)一個(gè)沒有標(biāo)題欄的窗口:
void CMyControl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
UNUSED_ALWAYS(nFlags);
if (!(GetWindowLong(m_hWnd, GWL_STYLE) & WS_CHILD))
PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x,point.y));
else
GetParent()->PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x,point.y));
}
205 用指定字體在dc中寫字:
HDC hdc = ::GetDC(NULL);
HFONT hfont,holdfont;
hfont = (HFONT)GetStockObject(OEM_FIXED_FONT);
holdfont = (HFONT)SelectObject(hdc,hfont);
TextOut(hdc,10,50,"\1\2\3\4",8);
SelectObject(hdc,holdfont);
DeleteDC(hdc);
-------------------------------------------------------
206 桌面主題更改的消息:WM_THEMECHANGED
207 修改菜單項(xiàng)的名稱:
CMenu *pMenu = AfxGetMainWnd()->GetMenu()->GetSubMenu(0);
pMenu->ModifyMenu(0,MF_BYPOSITION,0,"Test");
208 __LINE__表示本行代碼在程序中第幾行,同樣:__FILE__表示當(dāng)前文件的全路徑
CString str;
str.Format("Line is %d", __LINE__); //指這行
AfxMessageBox(str);
209 查看系統(tǒng)函數(shù)的源代碼的方法:裝一個(gè)Visual Assist X,想看某個(gè)函數(shù)的時(shí)候ALT + G
210 一直以來,想實(shí)現(xiàn)窗口透明程度不同,或局部透明,局部不透明,但這也只是夢想,下面這個(gè)函數(shù)看來可以讓我們夢想成真:UpdateLayeredWindow
211 LOGFONT各成員的意義:
LOGFONT lf;
lf.lfHeight=-80; //字體字符的高度
lf.lfWidth=0; //字符平均寬度
lf.lfEscapement=45; //文本行逆時(shí)針旋轉(zhuǎn)45度
lf.lfOrientation=0; //字符角度
lf.lfWeight=FW_HEAVY; //字符的粗細(xì)度
lf.lfItalic=FALSE; //傾斜
lf.lfUnderline=FALSE; //下劃線
lf.lfStrikeOut=FALSE; //刪除線
lf.lfCharSet=GB2312_CHARSET; //中文字符集
lf.lfOutPrecision=OUT_STROKE_PRECIS; //字體輸出結(jié)果和要求的匹配程度
lf.lfClipPrecision=CLIP_STROKE_PRECIS; //如何裁剪落于裁剪區(qū)之外的字符
lf.lfQuality=DRAFT_QUALITY; //字體屬性匹配的精確程度
lf.lfPitchAndFamily=VARIABLE_PITCH | FF_MODERN; //字體間距和字體族
strcpy(lf.lfFaceName,"楷體_GB2312"); //楷體
m_font.CreateFontIndirect(&lf); //m_font為類的成員變量:CFont m_font;
---------------------------------------------------------------------------------
212 指向指象主對話框的指針:AfxGetApp()->m_pMainWnd或AfxGetApp()->GetMainWnd()
213 去除F1的幫助功能,重載WM_HELPINFO消息:
BOOL CYourdlgDlg::OnHelpInfo(HELPINFO* pHelpInfo)
{
return TRUE;//CDialog::OnHelpInfo(pHelpInfo);
}
214 串口(包括USB轉(zhuǎn)串口)幾個(gè)小問題:http://community.csdn.net/Expert/topic/4470/4470922.xml?temp=.9018061
215 控制輸入法相關(guān)的幾個(gè)函數(shù):ImmGetContext、ImmGetConversionStatus、ImmSetConversionStatus、ImmReleaseContext等
216 限定輸出字符的矩形范圍:ExtTextOut或DrawText
217 控制滾動(dòng)條的顯示或隱藏:CWnd::ShowScrollBar(UINT nBar,BOOL bShow = TRUE)
218 注冊表中:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum下IDE和SCSI分支中枚舉所有這兩種設(shè)備。
219 更改當(dāng)前時(shí)區(qū):SetTimeZoneInformation
獲得當(dāng)前時(shí)區(qū):GetTimeZoneInformation
220 直接讀取硬盤的指定扇區(qū):
(1)用匯編;
(2)直接用CreateFile("\\.\PHYSICALDRIVE0", ...)打開物理磁盤設(shè)備即可(物理磁盤設(shè)備都是從0開始排號的,0表示第一塊硬盤,1表示第二塊硬盤....),這樣用SetFilePointer可以隨意讀取硬盤上任何位置的東西!至于扇區(qū)嘛,一般都是512字節(jié)為1扇區(qū)的,自己換算就是了~ <===================還沒試,不過這里有更多內(nèi)容:http://www.51cto.com/html/2005/1110/11133.htm
221 獲得本機(jī)并口的起始地址:
可以讀取bios數(shù)據(jù)區(qū)域,當(dāng)然只能在未進(jìn)入保護(hù)模式的操作系統(tǒng)前或dos下讀取
段地址:00H
408H 字 計(jì)算機(jī)上0號并行打印機(jī)適配器的基地址,
40AH 字 計(jì)算機(jī)上1號并行打印機(jī)適配器的基地址。
40CH 字 計(jì)算機(jī)上2號并行打印機(jī)適配器的基地址。
40EH 字 計(jì)算機(jī)上3號并行打印機(jī)適配器的基地址。(PS2型此值為擴(kuò)展BIOS數(shù)據(jù)區(qū)段地址)
SetupAPI可以得到所有設(shè)備的信息包括IO端口,內(nèi)存資源,中斷號碼
222 更換桌面背景:
方法一:
看這里:http://www.vckbase.com/vckbase/vckbase10/vc/nonctrls/atlcomocx_02/1002001.htm,用了com中IActiveDesktop,這是個(gè)活動(dòng)桌面的COM接口,還有智能指針,可以順便學(xué)習(xí)一下這方面內(nèi)容;
方法二:
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "c:\\aa.bmp", 1); //jpg圖片不行,無法顯示
223 讓多行風(fēng)格的編輯框控件顯示指定行又一法:m_txt.LineScroll(m_txt.GetLineCount()); //m_txt為CEdit控件綁定變量
224 控制音量API:waveOutSetVolume
225 在程序運(yùn)行期間,怎樣禁止窗口右上方的關(guān)閉按鈕
---------------------------------------------------------------
CMenu *pMenu = AfxGetMainWnd()->GetSystemMenu(FALSE) ;
if (pMenu)
pMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND|MF_GRAYED) ;
// 變?yōu)榉墙範(fàn)顟B(tài)
CMenu *pMenu = AfxGetMainWnd()->GetSystemMenu(FALSE) ;
if (pMenu)
pMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND|MF_ENABLED) ;
---------------------------------------------------------------
226 請問如何讓SDI程序啟動(dòng)時(shí)自動(dòng)隱藏:http://community.csdn.net/Expert/topic/4602/4602225.xml?temp=.1871607
http://blog.csdn.net/enoloo/archive/2004/06/07/17638.aspx //這個(gè)是要最大化的
把pMainFrame->ShowWindow(SW_HIDE);這句加在ParseCommandLine(cmdInfo);的后面,if (!ProcessShellCommand(cmdInfo))的前面
227 經(jīng)常有人問有沒有高效的方法,可以知道一個(gè)文本文件有多少行,抽空寫了幾行代碼回復(fù)在貼子中:http://community.csdn.net/Expert/topic/4601/4601972.xml?temp=.5953943
228 精確的計(jì)時(shí): <========================還沒試
__int64 lfreq;
BOOL bret=QueryPerformanceFrequency((LARGE_INTEGER*)&lfreq);
__int64 lstart;
QueryPerformanceCounter((LARGE_INTEGER*)&lstart);
//... call your function
__int64 lstop;
QueryPerformanceCounter((LARGE_INTEGER*)&lstop);
__int64 lruntime=lstop - lstart;
double dsec= lruntime/lfreq;
229 命令行處理的封裝類CCommandLineInfo和CCommandLineInfoEx
230 操作臨時(shí)文件,臨時(shí)文件的使用方法基本與常規(guī)文件一樣,只是文件名應(yīng)該調(diào)用函數(shù)GetTempFileName()獲得。它的第一個(gè)參數(shù)是建立此臨時(shí)文件的路徑,第二個(gè)參數(shù)是建立臨時(shí)文件名的前綴,第四個(gè)參數(shù)用于得到建立的臨時(shí)文件名:
-----------------------------------------
char szTempPath[_MAX_PATH],szTempfile[_MAX_PATH];
GetTempPath(_MAX_PATH, szTempPath);
GetTempFileName(szTempPath,_T("my_"),0,szTempfile);
-----------------------------------------
231 彈出USB設(shè)備安全刪除對話框:WinExec("C:\\WINDOWS\\system32\\rundll32.exe shell32.dll,Control_RunDLL hotplug.dll",SW_SHOW);
232 彈出“數(shù)據(jù)鏈接屬性”對話框:IDataSourceLocatorPtr::PromptNew();
233 ActiveSkin 4.3 軟件換膚在VC中的實(shí)現(xiàn):http://www.vckbase.com/document/viewdoc/?id=1288
234 CBitmap=====>HBITMAP:
-------------------------------------------------------------------------------------
CBitmap bitmap;
HBITMAP hbitmap=(HBITMAP)bitmap; //CBitmap中重載了HBITMAP()操作符,可以方便地用它來強(qiáng)制轉(zhuǎn)換
-------------------------------------------------------------------------------------
HBITMAP=====>CBitmap:
---------------------------------------
HBITMAP hbitmap;
CBitmap bitmap;
bitmap.FromHandle(hbitmap);
---------------------------------------
235 從其它.exe文件提取.ico圖標(biāo)作為自己程序的圖標(biāo):
----------------------------------------------------------------------
HINSTANCE hInst = LoadLibrary("b.exe");
HRSRC hRc = FindResource(hInst, (LPCSTR)1, (LPCSTR)RT_ICON);
LPVOID lpResource = LockResource(LoadResource(hInst,hRc));
HANDLE hUpdate = BeginUpdateResource("a.exe", FALSE);
UpdateResource(hUpdate, (LPCSTR)RT_ICON, (LPCSTR)1, 0, lpResource, SizeofResource(hInst, hRc));
EndUpdateResource(hUpdate, FALSE);
CloseHandle(hRc);
FreeLibrary(hInst);
-----------------------------------------------------------------------
236 得到當(dāng)前屏幕的參數(shù),最好是用函數(shù)EnumDisplaySettings(其它的方法如:GetSystemMetrics(SM_CYFULLSCREEN);會(huì)因?yàn)槿蝿?wù)欄是否隱藏而可能得不到真實(shí)高度),這個(gè)函數(shù)功能強(qiáng)大,可根據(jù)指定的設(shè)備名(第一個(gè)參數(shù))返回它的顯示信息:
-------------------------------------------------------------------------------
CString strCurrentDifferency,strCurrentColorMode; //分別用來存放屏幕當(dāng)前分辨率、色彩位數(shù)的字符串
LPDEVMODE gpCurrentMode = new DEVMODE; //用來存儲屏幕當(dāng)前設(shè)置的結(jié)構(gòu)指針
EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, gpCurrentMode); //獲得當(dāng)前分辨率的大小和其它信息
strCurrentDifferency.Format("分辨率:%d*%d",gpCurrentMode->dmPelsWidth,gpCurrentMode->dmPelsHeight);
strCurrentColorMode.Format("當(dāng)前顏色位數(shù):%d",gpCurrentMode->dmDisplayFrequency);
AfxMessageBox(strCurrentDifferency);
AfxMessageBox(strCurrentColorMode);
delete gpCurrentMode;
gpCurrentMode=NULL;
--------------------------------------------------------------------------------
用CDC::GetDeviceCaps函數(shù)也可以:
-------------------------------------------------------------------------------------------------------
CString strCurrentDifferency;
CDC *pDC=CDC::FromHandle(::GetDC(0)); //隨便獲得一個(gè)DC指針就可以了,這里是獲得桌面的DC
strCurrentDifferency.Format("分辨率:%d*%d",pDC->GetDeviceCaps(HORZRES),pDC->GetDeviceCaps(VERTRES));
AfxMessageBox(strCurrentDifferency);
-------------------------------------------------------------------------------------------------------
237 組合框控件在Dropdown類型時(shí),如何設(shè)置其為只讀的:
-----------------------------------------------------------------------------
CComboBox *pCombo = (CComboBox*)GetDlgItem(IDC_COMBO1);
HWND hEdit = ::FindWindowEx(pCombo->GetSafeHwnd(), NULL, _T("EDIT"), NULL);
if (hEdit)
::SendMessage(hEdit, EM_SETREADONLY, TRUE, 0);
-----------------------------------------------------------------------------
238 解決這個(gè)工程出現(xiàn)重復(fù)編譯的錯(cuò)誤:http://community.csdn.net/Expert/topic/4610/4610652.xml?temp=.9251825
239 偵測計(jì)算機(jī)是否連上網(wǎng)絡(luò):InternetGetConnectedStateEx
240 枚舉軟件或硬件設(shè)備:IMDServiceProvider::EnumDevices
241 對話框中控件內(nèi)容的打印:http://community.csdn.net/Expert/topic/4609/4609829.xml?temp=.1613275
使你的dialog支持打印預(yù)覽:http://www.codeproject.com/printing/#Print+Preview
http://www.codeproject.com/listctrl/listprintdemo.asp
現(xiàn)在沒有打印機(jī)可試,記在這里先,以后有了再測試。
242 結(jié)束其它的進(jìn)程:GetWindowThreadProcessId和TerminateProcess函數(shù),不過TerminateProcess盡量少用,它可以直接結(jié)束目標(biāo)進(jìn)程,目標(biāo)進(jìn)程死都不知道是自己怎么死的,來不及保存自己的數(shù)據(jù)結(jié)果,也來不及通知自己所調(diào)用的.dll文件不用給自己做晚飯了,當(dāng)然也來不及打電話給它的子進(jìn)程說:“阿珍,其實(shí)我一直都想對你說:我愛你!”
這里還有個(gè)貼子:http://community.csdn.net/Expert/topic/4608/4608816.xml?temp=.9869654
243 用LockFile函數(shù)鎖定一個(gè)打開文件的某一個(gè)區(qū)域,可以防止其它進(jìn)程訪問該區(qū)域。
244 使CListCtrl控件的Item標(biāo)簽可以修改:ModifyStyle(0,LVS_EDITLABELS);
245 如何動(dòng)態(tài)的改變菜單項(xiàng)在狀態(tài)欄中的提示:http://community.csdn.net/Expert/topic/4615/4615363.xml?temp=2.514064E-03
重載CFrameWnd的virtual void GetMessageString(UINT nID, CString& rMessage) const;函數(shù)
實(shí)現(xiàn):
--------------------------------------------------------------------------------
void CMainFrame::GetMessageString(UINT nID, CString& rMessage) const
{
if(nID == ID_FILE_NEW) //這里可以動(dòng)態(tài)改變
{
rMessage = "Create new file!";
return;
}
CFrameWnd::GetMessageString(nID,rMessage); //調(diào)用默認(rèn)的處理過程
}
--------------------------------------------------------------------------------
對話框工程中:
Handle the WM_MENUSELECT message. The wParam is the menu index, which is also the index of the stringtable entry that describes the menu. This prompting is ordinarily handled by the mainframe, but in a dialog-based app you have to add your own handler
246 修改.exe或其它模塊的資源,參考下面幾個(gè)函數(shù): <===========沒試過,不過看上去可行,用到時(shí)再試吧^_^
LoadLibrary
FindResource
LoadResource
LockResource
BeginUpdateResource
UpdateResource
EndUpdateResource
FreeResource
具體見MSDN,上面同時(shí)給出了調(diào)用順序,看了參數(shù)就明白了
247 請問NULL和null,TRUE和true,FALSE和false等有啥區(qū)別?
1.FALSE/TRUE與false/true的區(qū)別:
false/true是標(biāo)準(zhǔn)C++語言里新增的關(guān)鍵字,而FALSE/TRUE是通過#define,這要用途是解決程序在C與C++中環(huán)境的差異,以下是FALSE/TRUE在windef.h的定義:
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
也就是說FALSE/TRUE是int類型,而false/true是bool類型;所以兩者不一樣的,只不過我們在使用中沒有這種感覺,因?yàn)镃++會(huì)幫你做隱式轉(zhuǎn)換。
2.bool的大小與BOOL的區(qū)別:
bool在C++里是占用1字節(jié),而BOOL是int類型,int類型的大小是視具體環(huán)境而定的;所以來說:false/true只占用1個(gè)字節(jié),而TRUE/FALSE視具體環(huán)境而言
248 CFile::GetStatus也可以獲得文件的屬性信息
249 獲取桌面所有頂級窗口:EnumDesktopWindows、EnumWindowsProc
250 顯示用DirectShow捕捉下來的視頻:
DirectShow的 IVideoWindow可以設(shè)置
---------------------------------------------------------------------
IVideoWindow *pVidWin = NULL;
pGraph->QueryInterface(IID_IVideoWindow, (void **)&g_pVidWin);
pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
RECT grc;
GetClientRect(hwnd, &grc);
pVidWin->SetWindowPosition(0, 0, grc.right, grc.bottom);
---------------------------------------------------------------------
251 改變編輯框控件中光標(biāo)的圖形:
----------------------------------------------------------
CBitmap* pBitmap = new CBitmap;
pBitmap->LoadBitmap(IDB_HAPPY_BITMAP); //IDB_HAPPY_BITMAP為工程中.bmp資源,大小任意,但顏色超過16色的話色彩會(huì)失真
m_editCtrl.CreateCaret(pBitmap); //m_editCtrl為編輯框控件變量
POINT point;
point.x=0;
point.y=0;
m_editCtrl.SetCaretPos(point); //改變光標(biāo)的位置,以像素為單位
m_editCtrl.ShowCaret();
----------------------------------------------------------
252 用主題函數(shù)改變對話框窗口的可視風(fēng)格(MSDN上可查到更多這方面的函數(shù)):
----------------------------------------------------------------
#include
#pragma comment(lib,"uxtheme.lib")
void CMyDlg::OnTest()
{
EnableThemeDialogTexture(m_hWnd,ETDT_ENABLE | ETDT_USETABTEXTURE);
Invalidate();
}
----------------------------------------------------------------
253 如何讓MDI程序在啟動(dòng)的時(shí)候不新建子窗口:http://community.csdn.net/Expert/topic/4619/4619802.xml?temp=.2809107
在App的InitInstance中加一行:
--------------------------------------------------------
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
cmdInfo.m_nShellCommand=CCommandLineInfo::FileNothing; //添加這一句
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
--------------------------------------------------------
254 關(guān)機(jī):ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF, 0 ) <=====還沒試
強(qiáng)制關(guān)機(jī)ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN or EWX_POWEROFF, 0 );
255 hook:http://community.csdn.net/Expert/topic/4615/4615606.xml?temp=.7596094
256 字符串====>日期時(shí)間:
-------------------------------------------------
COleDateTime dt;
dt.ParseDateTime(_T("2006-2-14 8:00:00"));
SYSTEMTIME st={0};
dt.GetAsSystemTime(st);
//SetLocalTime(&st); //設(shè)置電腦中時(shí)間
-------------------------------------------------
日期時(shí)間====>字符串:
-------------------------------------------------
SYSTEMTIME st={0};
st.wYear=2006;
st.wMonth=3;
st.wDay=23;
st.wHour=8;
st.wMinute=30;
st.wSecond=59;
COleDateTime dt(st);
AfxMessageBox(dt.Format());
-------------------------------------------------
257 typeid函數(shù)可以判斷一個(gè)對象的類型,詳見MSDN,上面有示例代碼,不過有點(diǎn)小問題:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_pluslang_typeid_operator.asp
258 系統(tǒng)休眠,摘自:http://community.csdn.net/Expert/topic/4637/4637403.xml?temp=.8914301
------------------------------------------------------------------------------------------------
if(MessageBox("確實(shí)要休眠嗎?","關(guān)機(jī)程序",MB_YESNO|MB_DEFBUTTON2|MB_ICONQUESTION)==IDYES)
{
static HANDLE hToken;
static TOKEN_PRIVILEGES tp;
static LUID luid;
if(::OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
{
::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);
tp.PrivilegeCount=1;
tp.Privileges[0].Luid =luid;
tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED;
::AdjustTokenPrivileges(hToken,false,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
}
::SetSystemPowerState(false,true);
}
-------------------------------------------------------------------------------------------------
259 在錄音時(shí)如何控制錄音屬性中麥克風(fēng)或者線路輸入的音量
1.mixerGetNumDevs獲取混音設(shè)備數(shù)量
2.循環(huán)獲取設(shè)備信息mixerOpen/mixerGetLineInfo
3.根據(jù)獲得的MIXERLINE中dwComponentType判斷類型來確定是線入/麥克風(fēng)
MIXERLINE_COMPONENTTYPE_SRC_LINE/MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE
4.mixerSetControlDetails設(shè)置音量
260 用資源管理器打開指定文件夾,并置目標(biāo)文件夾為選定狀態(tài):WinExec("explorer /n,/select,f:\\win98", SW_SHOWNORMAL );
261 打開或關(guān)閉輸入法:IActiveIME::SetActiveContext
262 提取.exe或.dll文件中的圖標(biāo):ExtractIcon
263 捕捉其他程序最大、最小化消息:http://community.csdn.net/Expert/topic/4647/4647630.xml?temp=.8477289
264 WM_DEVICECHANGLE消息配合DeviceIoControl函數(shù)可禁用U盤
265 判斷編輯框控件是否為只讀的:
----------------------------------------------------
CEdit *temp=(CEdit *)GetDlgItem(IDC_EDIT1);
DWORD a=temp->GetStyle();
if(a & ES_READONLY) //ES_READONLY=0x800
AfxMessageBox("Read only");
else
AfxMessageBox("NOT read only");
----------------------------------------------------
266 獲得系統(tǒng)電源狀態(tài):
GetSystemPowerStatus
Retrieves the power status of the system. The status indicates whether the system is running on AC or DC power, whether the battery is currently charging, and how much battery life remains.
267 桌面元素的操作:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_adv/activedesktop.asp
268 如何判斷是鍵盤左邊的Shift還是右邊的Shift鍵,摘自:http://community.csdn.net/Expert/topic/4661/4661661.xml?temp=8.190554E-02
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/virtualkeycodes.asp
上面URL中MSDN給出了所有按鍵的ASCII碼。
VK_LSHIFT (A0)
Left SHIFT key
VK_RSHIFT (A1)
Right SHIFT key
269 C++開發(fā)常用工具:http://blog.vckbase.com/FlowSand/archive/2006/01/27/17447.html
270 sprintf中打印百分號%的方法,摘自:http://blog.vckbase.com/smileonce/archive/2006/03/16/18521.html
------------------------------------------------------------
int percent = 50;
char buf[100];
sprintf(buf, "%d%%%% complete\n! ", percent);
printf(buf); //這樣就只打印一個(gè)%了
printf("%s",buf); //改成這樣后打印出兩個(gè)%了,恰如我們期望的
------------------------------------------------------------
271 精確延時(shí),KeStallExecutionProcessor函數(shù)來幫你,摘自:http://blog.vckbase.com/zaboli/archive/2006/03/24/18705.html
但是問題是KeStallExecutionProcessor的文檔說,他的最小周期不能大于 50微秒!不然會(huì)造成系統(tǒng)停頓。。
測試得出 KeStallExecutionProcessor(416)在有的機(jī)器上會(huì)造成鼠標(biāo)停頓 -_-但是KeDelayExecutionThread(KernelMode, FALSE, &WaitTime); 無論再怎么設(shè)置小的超時(shí),結(jié)果都如下10毫秒???差太多了吧。。。
272 向控件發(fā)送鼠標(biāo)滾輪的消息:
::SendMessage(m_cListCtrl.m_hWnd,WM_MOUSEWHEEL,(WPARAM)-7864320,0); //參數(shù)三是向下滾動(dòng)的參數(shù),7864320則為向上滾動(dòng)
273 數(shù)日前收到天影朋友的23種設(shè)計(jì)模式的例子,很淺顯易懂。下面的blog中亦有設(shè)計(jì)模式的探討,借古喻今,文筆不錯(cuò),可供參考:
http://blog.csdn.net/junguo/
274 獲得文件夾大小的方法,摘自:http://community.csdn.net/Expert/topic/4672/4672088.xml?temp=.2216761
----------------------------------------------------------------------------------
#include
#import "scrrun.dll" raw_interfaces_only
int main()
{
CoInitialize(NULL);
{
try
{
Scripting::IFileSystem3Ptr fs;
fs.CreateInstance(__uuidof(Scripting::FileSystemObject));
Scripting::IFolderPtr folder;
fs->GetFolder(_bstr_t("f:\\win98"),&folder);
_variant_t vsize;folder->get_Size(&vsize);
cout<<"f:\\win98 size:"<<(long)vsize<<" bytes"< }
catch(_com_error &e)
{
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
cout<<"Get directory size via FileSystemObject, by masterz"< cout<<"COM error occurred,source:"<<(LPCTSTR)bstrSource< cout<<"Description:"<<(LPCTSTR)bstrDescription< }
}
CoUninitialize();
return 0;
}
----------------------------------------------------------------------------------
275 打開控制臺界面,寫點(diǎn)文字在上面:
----------------------------------------------------------------------------------
AllocConsole();//打開控制臺窗口
HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE);//得到控制臺句柄
unsigned long lgsize;
char *strbuf="顯示這行信息。";
WriteFile(hOutput,strbuf,strlen(strbuf),&lgsize,0);
FreeConsole();//關(guān)閉釋放用于輸入新信息的控制臺窗口
posted on 2008-12-03 11:20
greatws 閱讀(4171)
評論(0) 編輯 收藏 引用