1 toolbar預設位圖左上角那個點的顔色是透明色,不喜歡的話可以自己改。
2 VC++中 WM_QUERYENDSESSION WM_ENDSESSION 為系統關機消息。
3 Java學習書推薦:《java程式設計思想》
4 在VC下執行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
下面這個示例的函數可以把給定的DOS指令執行一遍,并把DOS下的輸出内容記錄在buffer中。同時示範了匿名管道重定向輸出的用法:
-------------------------------------------------------------------------------------
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]; //長達1K的指令行,夠用了吧
strcpy(command,"Cmd.exe /C ");
strcat(command,EXECDOSCMD);
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite; //把建立程序的标準錯誤輸出重定向到管道輸入
si.hStdOutput = hWrite; //把建立程序的标準輸出重定向到管道輸入
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
//關鍵步驟,CreateProcess函數參數意義請查閱MSDN
if (!CreateProcess(NULL, command,NULL,NULL,TRUE,NULL,NULL,NULL,&si,π))
CloseHandle(hWrite);
CloseHandle(hRead);
}
char buffer[4096] = {0}; //用4K的空間來存儲輸出的内容,隻要不是顯示檔案内容,一般情況下是夠用了。
DWORD bytesRead;
while (true)
if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
break;
//buffer中就是執行的結果,可以儲存到文本,也可以直接輸出
AfxMessageBox(buffer); //這裡是彈出對話框顯示
CloseHandle(hRead);
return TRUE;
5 删除目錄,包含删除子檔案夾以及其中的内容
-------------------------------------------------
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);//比如沒有找到檔案夾,删除失敗,可把此句删除
-------------------------------------------------------------
6 讓程式暫停:system("PAUSE");
7 在PreTranslateMessage中捕捉鍵盤事件
if (pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN)return TRUE; //注意return的值
8 更改按鍵消息(下面的代碼可把Enter鍵消息改為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: 一個可以移動、改變視窗位置和大小的函數
10 16進制轉化成10進制小數的問題
用一個讀二進制檔案的軟體讀檔案
二進制檔案中的一段 8F C2 F5 3C 最後變成了 0.03
請問這是怎麼轉換過來的??
方法一:浮點技術法,如
DWORD dw=0x3CF5C28F;
float d=*(float*)&dw;//0.03;
方法二:浮點的儲存方式和整數完全兩樣,你想了解的話可以去
看一看,不過通常我們都不必了解它就可以完成轉換。
char a[4] = {0x8F, 0xC2, 0xF5, 0x3C};
float f;
memcpy(&f,a,sizeof(float));
TRACE("%d",0x3CF5C28F);
11 EDIT控件的 EM_SETSEL,EM_REPLACESEL消息
12 在其它程序中監視鍵盤消息:用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,"你要監控的程序窗體(用SPY++看)"),
if (thread_hwnd==NULL) 。。。。。。。。。。
else DWORD thread_id=GetWindowThreadProcessId(thread_hwnd,NULL)
15 waveOutGetVolume()可以得到波形音量大小
16 隐藏桌面圖示并禁用右鍵功能菜單:
------------------------------------
HWND Hwd = ::FindWindow("Progman", NULL);
if (bShowed)
::ShowWindow(Hwd, SW_HIDE);
::ShowWindow(Hwd, SW_SHOW);
bShowed = !bShowed;
---------------------------------------
17 獲得程式目前路徑:
---------------------------------------------
char ch[256];
GetModuleFileName(NULL,ch,255);
for(int i=strlen(ch);i && ch[i]!='\\';i--);
ch[i]=0;
AfxMessageBox(ch);
----------------------------------------------
18 KeyboardProc的lParam中包含着許多按鍵資訊,其中第31位(從0開始)為0表示是按下按鍵,為1表示松開按鍵。
(lParam & 0x80000000)進行二進制'與'計算,效果是取第31位的值。
(lParam & 0x40000000)是取第30位,30位表示按鍵的上一個狀态,為1表示之前鍵已經是按下的,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 複制檔案應該用到CopyFile或是CopyFileEx這兩個API
20 移動視窗的位置或改變大小:MoveWindow/SetWindowPos
21 我的程式是目前運作的程式時,可以用setcursor()來設定光标的圖示。
而且可以用setcapture()是滑鼠移動到我得程式視窗之外時也是我設定的圖示
但是如果我得程式不是目前的運作程式的,滑鼠就會變會預設的。
怎樣能夠,使得不變回預設的,還是用我設定的光标?
SetSystemCursor
22 SendMessage函數的幾個用法:
控制按鈕按下的,是這麼用的
SendMessage(n1, WM_COMMAND, MAKELPARAM(ID,BN_CLICKED),(LPARAM )n2); (n1,n2是句柄)
而得到文本内容,是這樣用的,
SendMessage(hWnd,WM_GETTEXT,10,(LPARAM)buf),
24 裝置發生改變處理函數可在CWnd::OnDeviceChange中,捕獲WMDEVICECHANGE事件不能區分諸如裝置插入、拔下消息。
25 把字元"abc\n123"存入文本檔案中時,檔案内容沒看見換行,其實用word打開該檔案是有換行的。另外用"abc\r\n123"代替也可看見換行。
26 ::SetFocus(::GetDesktopWindow()); 或::BringWindowToTop(::GetDesktopWindow());
::GetDesktopWindow()這裡可獲得桌面視窗的句柄
27 數組初始化:
int a[24][34]; //聲明數組
memset(a,-1,24*34); //全部元素初始化成-1,但初始化成除0和-1以外的數值是不行的
28 SHGetFileInfo函數可獲得檔案資訊。
29 建立一個控件:
HWND hEdit=CreateWindow("EDIT",NULL,WS_CHILD|WS_VISIBLE |ES_LEFT,50,20,50,20,hwnd,NULL,hInst,NULL); //hwnd參數為父視窗句柄
31 調用其它程式又要隐藏視窗:用CreateProcess函數調用,再拿到視窗句柄,然後::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"; //要删除的檔案夾
shfileop.pTo = "";
shfileop.lpszProgressTitle = "";
shfileop.fAnyOperationsAborted = TRUE;
int nOK = SHFileOperation(&shfileop);
34 函數前面加上::是什麼意思?
叫域運算符...在MFC中表示調用API...或其它全局函數...為了區分是mfc函數還是api
36 有關控件的一些常見問答:
37 在多文檔客戶區中增加位圖底圖示範程式:
我的對應工程:AddBackgroundBitmap
38 用VC++6.0實作PC機與單片機之間串行通信
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);
//這裡的小時數注意它的0:00點是早上8:00,是以要加上8,因為這是格林威治時間,換成我國時區要加8
CString m_strTemp;
SYSTEMTIME systemtime;
GetLocalTime(&systemtime); //這個函數可獲得毫秒級的目前時間
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 工作列上的圖示閃爍:
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()//閃爍多次
long lValue = 0xB28A43;
float fValue;
memcpy(&fValue,&lValue,sizeof(float));
42 在一個由漢字組成的字元串裡,由于一個漢字由兩個位元組組成,怎樣判斷其中一個位元組是漢字的第一個位元組,還是第二個位元組,使用IsDBCSLeadByte 函數能夠判斷一個字元是否是雙字的第一個位元組,試試看:)
_ismbslead
_ismbstrail
43 如何實作對話框面闆上的控件随着對話框大小變化自動調整
在OnSize中依其比例用MoveWindow同等縮放.http://www.codeproject.com/dialog/dlgresizearticle.asp
44 向 CListCtrl中插入資料後,它總是先縱向再橫向顯示,我希望他先橫向再縱向
如:
m_list.ReDraw(FALSE);
m_list.ReDraw(TRUE);
如何添加閃屏:Project->Add to Project->Components and Controls->Gallery\\Visual C++ Components->Splash screen
47 如何設定listview某行的顔色:
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進制的byte轉成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 怎樣查找到正處在滑鼠下面的視窗(具體到子視窗和菜單),無論是這個視窗是否具有焦點:
-----------------------------------------------------------
POINT pt;
CWnd* hWnd; // Find out which window owns the cursor
GetCursorPos(&pt);
hWnd=CWnd::WindowFromPoint(pt);
if(hWnd==this)
//滑鼠在窗體中空白處,即不在任何控件或子視窗當中
51 得到CListCtrl控件點選事件時點選的位置:
-----------------------------------------------
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;
53 自己處理按鍵響應函數:
BOOL CTest6Dlg::PreTranslateMessage(MSG* pMsg)
if( pMsg->message == WM_KEYDOWN )
if(pMsg->hwnd == GetDlgItem(IDC_EDIT1)->m_hWnd) //判斷目前控件是不是編輯框
switch( pMsg->wParam )
case VK_RETURN: //如果是Enter鍵的話
Onbutton1(); //就調用Button1的響應函數
return CDialog::PreTranslateMessage(pMsg);
---------------------------------------------------
55 兩個像素(用RGB表示)如何确定亮度等級:
權重算出灰階值:R*0.21+Green*0.70+Blue*0.09,或:
((紅色值 X 299) + (綠色值 X 587) + (藍色值 X 114)) / 1000
56 對已畫在CDC上的圖檔進行處理,實作任意比例的透明度。
實作方法是:
1、用GetCurrentBitmap得到DC上的CBitmap指針;
2、用GetBitmapBits得到CBitmap上的圖像資料流;
3、對圖像資料流中每個位元組進行轉換,轉換的公式為
pBits[i] += (255 - pBits[i]) * nTransparent / 100;//nTransparent為透明度的百分率
57 MFC很多API函數的源代碼都在:VC安裝目錄\VC98\MFC\SCR\WINCORE.cpp檔案中。
58 自己寫了個函數,用來獲得ANSI字元串中真實字元的個數,如“I服了U”的長度傳回4:
int GetCount(CString str)
int total=0;
for(int i=0;i
if (127<(unsigned int)str.GetAt(i))
total++;
i++;
return total;
----------------------------------------------------
59 消息傳遞中pMSG中一些參數的意義:
hwnd-------接收消息的視窗句柄;
message----發送的消息号;
wParam-----消息參數,具體意義同發送的消息有關;
lParam-----同上;
time-------發送消息時的時間,數值大小為自系統啟動以來經曆的時間,機關是毫秒;
pt---------發送消息時滑鼠在螢幕上的絕對坐标,機關是像素。
60 重新整理螢幕局部:
重新整理控件區域:
控件 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); //注意這個函數,會調用OnEraseBkgnd
--------------------------------------
62 獲得工作列高度:
----------------------------------
HWND hWnd = FindWindow("Shell_TrayWnd", NULL);
RECT rc;
::GetWindowRect(hWnd, &rc);
int iHeight = rc.bottom -rc.top;
-----------------------------------
下面還有範例兩個:
64 給ListBox控件加上水準滾動條:m_list.SetHorizontalExtent(100); //m_list為和listbox控件綁定的CListBox變量
67 制作一個沒有标題欄.菜單欄和工具欄的視窗,就象遊戲界面一樣:
68 為何組合框Droplist風格時響應鍵盤PreTranslateMessage函數,而dropdown風格時不響應:
69 直接用特殊字元的編碼:s=WCHAR(0x00e6); //還沒試過
75 使用并顯示64bit數值的方法:
__int64 ld = 2000000000*4500000000; //64bit數的範圍:-9223372036854775808~+9223372036854775807
printf("%I64d\n",ld);
在裡面找一下:Redirection
77 用代碼畫滑鼠圖案并限定滑鼠移動區域(用 ClipCursor函數):
先在對話框類的内部聲明一個CFont對象,如:CFont myfont;
myfont.CreatePointFont(500, "Arial");
GetDlgItem(IDC_EDIT1)->SetFont(&myfont);
79 bmp圖檔怎麼轉換為jpg:
用cximage
81 将16進制字元串轉換成10進制整數:
char a[3]="ab";
DWORD val = strtoul(a, NULL, 16);
82 快速從數字的字元串中提取出特定長度的數字:
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]; //這裡要注意多留點空間以存放各子串的長度
sscanf(s,"%[^,],%[^,],%[^,],%[^,]",a1,a2,a3,a4); //按指定字元(這裡是逗号)分隔
AfxMessageBox(a4);//顯示ddd
85 根據ComboBox加入的字元串的長度自動調整ComboBox控件的寬度:
//這裡假設為ComboBox加入兩個字元串
CString str1="中華人民共和國中華人民共和國",str2="1234567890123中國89012345678";
m_combo.AddString(str1); //m_combo為綁定在組合框控件的變量
m_combo.AddString(str2);
int len=str1.GetLength()*6.2; //根據加入的字元串長度(以位元組為機關)群組合框使用的預設字型的大小計算組合框實際需要的寬度,計算中間用到了整數->浮點數->整數的兩次數值類型隐式轉換,也可以用winAPI函數GetTextExtentPoint32()或GetTextExtent計算
m_combo.SetDroppedWidth(len);
87 往另一個程式的編輯框中發送文字:句柄 ->SendMessage(WM_SETTEXT,strlen(buf),(LPARAM)buf); //buf為你要加入的char*
91 在初始時候定位到LIST的指定行 (如第100行)開始顯示:EnsureVisible(100) //未驗證
--------------------------------------------------------------
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);
b = GetAsyncKeyState(65) >> ((sizeof(short) * 8)-1); //這裡不分大小寫
AfxMessageBox("你按下了Ctrl+Alt+A組合鍵。") ;
另外,GetAsyncKeyState和::GetKeyState這兩個函數也可以幫你檢測Shift、Ctrl和Alt這些鍵的狀态。
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); //用這個函數轉換
101 怎樣取得程式自己占用的記憶體和CPU占用率:GetProcessMemoryInfo和GetPerformanceInfo
102 如何讓你的程式運作在release模式下:build->set active configuration
103 監視檔案夾是否被更新:FindFirstChangeNotification、FindNextChangeNotification、 FindCloseChangeNotification這三個函數
107 強行操作記憶體虛拟位址中某個指定地方的内容:
int *a=(int*)0x00440000; //這裡以通路0x00440000位址為例
cout<<*a<
條碼掃描器主要有三種接口: 1.RS232 2.共用接盤接口 3.USB外設. 對于RS232,需要程式設計來監視和讀取條碼; 對于共用接盤接口,條碼資訊被轉換成相應的鍵盤消息,具有輸入焦點的應用程式會收到鍵盤輸入消息,我們以前的做法是做一個全局keyboard Hook或應用程式級别上 keyboard hook, 監視鍵盤消息,當有連續的鍵盤消息(在很短的時間内),并且這些鍵盤字元能構成完成的條碼資訊,就産生一條自定義消息,通知視窗(向監視程式注冊的視窗) 條碼資訊到達,條碼機隻是相當于一個鍵盤,是以你也可以在界面上放一個edit框,條碼機讀出條碼後還會在字元串後面加一個回車(這個一般是可設定的,可加可不加),如果條碼機自動加回車,則你重寫OnOK函數,将edit框的内容取出放入list即可。
當然也可不放edit框,而直接接收鍵盤字元(比如重寫OnChar函數等,方法很多),但要考慮到這種情況:條碼讀不出來的情況,此時應該用手動輸入條碼,是以還是放一個 edit框為好。
109 檢查指定檔案夾是否存在:PathIsDirectory()
方法一:
檢查給定路徑是否根目錄:BOOL PathIsRoot(LPCTSTR pPath);
說明:Returns TRUE for paths such as “\”, “ X:\”, “\\ server\ share”, or “\\ server\”。Paths such as “..\path2” will return FALSE.
用這兩個函數要先:#include ;
再把這個檔案加入工程:shlwapi.lib
方法二:
GetFileAttributes檢查檔案是否存在,并且檢查是否檔案夾屬性FILE_ATTRIBUTE_DIRECTORY
----------------------------------------------------------
DWORD = GetFileAttributes(_T("f:\\win98"));
if(dwAttr != 0xFFFFFFFF && (dwAttr & FILE_ATTRIBUTE_DIRECTORY))
cout<<"exist"<
cout<<"NOT exist"<
方法三:
用下面第113條的_access函數同樣可以
if(_access("f:\\win98",0)!=-1)
方法四:
用PathFileExists函數,見MSDN介紹,需要的條件同方法一。
還有一個:BOOL SHGetPathFromIDList(LPCITEMIDLIST pidl,LPTSTR pszPath);
Converts an item identifier list to a file system path.
111 打開顯示器: ::SendMessage(GetSafeHwnd(), WM_SYSCOMMAND, SC_MONITORPOWER, -1); //從bobob的blog上抄來的^_^
關閉顯示器: ::SendMessage(GetSafeHwnd(), WM_SYSCOMMAND, SC_MONITORPOWER, 1); //從bobob的blog上抄來的^_^
得到它的工作狀态:
休眠狀态是指用SendMessage(Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1)關閉的
--------------------------------------------------------------------------------
If you are trying to do this on Windows XP, then you can use SetupDiGetDeviceRegistryProperty and Property: SPDRP_DEVICE_POWER_DATA to get the power management information. This is documented in the Windows XP DDK.
The WMI Class Win32_DesktopMonitor does not report the power state. use SPI_GETPOWEROFFACTIVE or DeviceIOControl with IOCTL_VIDEO_GET_POWER_MANAGEMENT will simply reports power management is enabled or not. SPI_GETPOWEROFFACTIVE just determines whether the power-off phase of screen saving is enabled or not.
BTW, you can always use the SetThreadExecutionState or other APIs (you have used) to switch ON the monitor no matter the monitor is in the ON or OFF state.
References
112 得到系統時間、語言等的設定
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_ITIME, lpLCData, cchData); //從bobob的blog上抄來的^_^
113 檔案是否存在 (記得先包含頭檔案#include )
if(_access("c:\\somefile.txt",0)!=-1)
//存在
//不存在
還有一個方法:
if(GetFileAttributes("f:\\test.txt")!=0xFFFFFFFF)
114 得到剪貼闆資料
if ( OpenClipboard() )
HANDLE hData = GetClipboardData(CF_TEXT);
char * buffer = (char*)GlobalLock(hData); //剪貼闆中的文本内容儲存在buffer中
GlobalUnlock(hData);
CloseClipboard();
115 在CStatic上面關聯圖檔
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 顯示一個打開檔案夾的對話框,并得到使用者選擇的目錄:
-------------------------------------------
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)
if(!SHGetPathFromIDList(pidl, szDir))
AfxMessageBox(szDir); //szDir中存放的内容為使用者標明的目錄
117 去除字元串中指定的字元:
-----------------------------------------
strtemp.Format("%s","abc\n123\ndef");
strtemp.Remove('\n'); //這裡以去除換行符為例,結果儲存在strtemp中了
119 假如目前時間2005-09-09,如何計算在該時間前12345天,是哪年哪月哪日?
---------------------------
CTime tm(2005,9,9,0,0,0);
tm-=86400*12345;
cout<<
----------------------------
121 拖動控件時實作類似windows拖動視窗的效果:CRectTracker
123 尋找系統中的列印機:EnumPrinters
124 用代碼加入外部子產品的方法:#pragma comment(lib,"mylib.lib")
125 判斷指定點是否在一個矩形框内:CRect::PtInRect(POINT point)
126 winAPI 函數GetTextExtentPoint32()可以得出一個以像素為機關的字元串的寬度。
128 獲得指定程序占用記憶體的情況,用GetProcessMemoryInfo()函數。
132 如何建立共享目錄:直接調用标準的Win32API函數NetShareAdd和NetShareDel
135 Menu系列函數:
GetMenu
GetMenuInfo
GetMenuItemCount
GetMenuItemID
GetMenuString
EnableMenuItem
CheckMenuItem
ModifyMenu
RemoveMenu
InsertMenu
GetSystemMenu
::LoadMenu
::SetMenu
136 得到 SYSTEMMENU(系統菜單)的高度:GetSystemMetrics(SM_CYMENU);
得到目前螢幕分辨率:
GetSystemMetrics(SM_CXFULLSCREEN); //得x值(如1024)
GetSystemMetrics(SM_CYFULLSCREEN); //得y值( 如768-工作列高度)
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;
MD5Init
MD5Final
MD5Update
143 用CBrush::CreateStockObject(HOLLOW_BRUSH);或 CBrush::CreateStockObject(NULL_BRUSH);這兩個可以建立镂空的畫刷。
147 遠端線程注入:
148 CEditView中兩個函數的用法:
GetEditCtrl().ModifyStyle (0 , WS_VSCROLL |ES_AUTOHSCROLL |ES_AUTOVSCROLL |WS_HSCROLL |ES_WANTRETURN | ES_MULTILINE);
GetEditCtrl().GetSel(m_nStartChar, m_nEndChar ) ;
149 給對話框窗體底部加上狀态條,把下面代碼加進對話框的OnInitDialog()函數中:
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的頻率:
Hardware\\Description\\System\\CentralProcessor\\1 //1 為第二個cpu
-----------------------------------------------------------------------
SYSTEM_INFO siSysInfo;
GetSystemInfo(&siSysInfo);
printf(" Number of processors: %u\n", siSysInfo.dwNumberOfProcessors);
處理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這一個靜态文本控件起作用了
pDC->SetBkColor(RGB(255,255,255)); //背景色為白
pDC->SetTextColor(RGB(0,0,0)); //前景色為黑
hbr = CreateSolidBrush(RGB(255,255,255)); //其它區域也為白
//上面三行代碼改成下面這三行就建立空心刷子,就可以實作在背景上寫字的效果了
//pDC->SetBkMode(TRANSPARENT);
//pDC->SetTextColor(RGB(0,0,0));
//hbr = CreateStockObject(NULL_BRUSH);
hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Return a different brush if the default is not desired
return hbr;
----------------------------------------------------------------------
再加一個判斷if (pWnd->GetDlgCtrlID()==IDC_....)就可以指定是改變哪個的顔色了,其它控件的顔色的改變方法和這個大同小異。
152 怎樣獲得字型得寬度,高度,間距等資訊:GetTextMetrics
153 為了讓你對i++有個更清楚的認識,先看如下代碼:
-------------------
int i=2;
i=(i++) % 3;
printf("i=%d",i); //這裡輸出i=?呢
下面是前兩行代碼的彙編代碼:
------------------------------------------------------------------------------------------------------------------
00401778 mov dword ptr [ebp-4],2 把值2寫入記憶體中[ebp-4]指向的位置(後面稱變量i) //相當于i=2
0040177F mov eax,dword ptr [ebp-4] 把i的目前值2賦于eax中 //把eax當成了i的臨時變量了
00401782 cdq
00401783 mov ecx,3 把3賦于ecx中 //同樣ecx也成了臨時變量了
00401788 idiv eax,ecx eax % ecx(2%3),結果放入edx中(等于2)
0040178A mov dword ptr [ebp-4],edx 把edx中的值2寫入變量i //相當于計算i=2 % 3
0040178D mov edx,dword ptr [ebp-4] 把i的值2賦于edx //現在edx成了i的臨時變量
00401790 add edx,1 edx中的值加上1
00401793 mov dword ptr [ebp-4],edx 把edx中的值3寫入變量i //上面三條指令完成i=i+1
最終的結果i=3,如果把運算符%換成+,則結果i=6(注意,這是在VC下得到的結果,不同的編譯器得到的結果可能會不同!)
---------------------------------------------------------------
if(::GetForegroundWindow()!=m_MainWnd)
::SetForegroundWindow(m_MainWnd);
::SetFocus( m_MainWnd);
---------------------------------------------------------------
或:
::ShowWindow(m_MainWnd, SW_SHOW);
::SetForegroundWindow(m_MainWnd);
156 判斷目前線程的目前輸入法是中文還是英文輸入法(至于到底是哪種中文輸入法我也不知道):
-------------------------------------------------------------------------
HKL hKl = GetKeyboardLayout(0); //這裡0表示目前線程,要查指定線程的話可以用指定線程的辨別符代替
if (ImmIsIME(hKl))
AfxMessageBox("目前是中文輸入法。");
其它地區語言輸入法的資訊在MSDN中搜尋:Table of Language Identifiers
157 動态建立靜态控件并加載.bmp圖檔,先在對話框類中定義成員變量:
public:
CStatic m_pp; //這個是在對話框類中定義的
再:
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中建立視窗時對于資源等,需要先進行狀态處理: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);
160 怎麼修改MFC單文檔程式的标題,經常有人在網上問這個問題,在C****App::InitInstance()的代碼中加入一行就行了:
BOOL CJPGGifApp::InitInstance()
AfxEnableControlContainer();
...... //這裡省略自動生成的代碼
// The one and only window has been initialized, so show and update it.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
m_pMainWnd->SetWindowText("我的标題"); //加入這一行就可以了,注意要加在ShowWindow和UpdateWindow的後面
------------------------------------------------------------
玩過Windows的掃雷遊戲嗎?該遊戲中就有一個同時按下滑鼠左右鍵的操作,其實對同時按下滑鼠左右鍵的判斷并不複雜,判斷方法與判斷滑鼠按鍵是否與Ctrl和Shift同時按下的方法相同,這裡要用到滑鼠消息中的wparam項,其中含有我們想要的幾個按鍵的狀态。定義如下:
(1)MK_CONTROL:Ctrl鍵按下時置1;
(2)MK_LBUTTON:滑鼠左鍵按下時置1;
(3)MK_MBUTTON:滑鼠中鍵按下時置1;
(4)MK_RBUTTON:滑鼠右鍵按下時置1;
(5)MK_SHIFT:Shift鍵按下時置1。
通過判斷這幾個标志位可以得到同時按下的幾個鍵的狀态,進而判斷是否有其它鍵同時按下。
166 讓編譯器忽略某種警告:
--------------------------------
#pragma warning (disable : 4101)
上面的代碼加上後編譯器不會再出現warning C4101: 'i' : unreferenced local variable這樣的警告了。
167 枚舉網頁各個元素,參考:
168 rundll32.exe,這個程式很友善,用它可以調用任何 DLL 中的函數。你隻要給它提供 DLL、函數名以及要傳遞的參數即可。Rundll32.exe 絕對多才多藝,你可以用它來關閉和重新開機 Windows,建立快捷方式以及啟動控制台程式。隻要知道要調用的DLLs,一切都搞掂。你可以象下面這樣用 rundll32.exe 從指令行打開一個 URL:
url.dll 中的函數 FileProtocolHandler 負責這個工作。
169 HDC===>CDC*
HDC hdc=::GetWindowDC(this->m_hWnd); //獲得視窗标題欄區域
CDC* pDC = CDC::FromHandle(hdc);
CDC*===>HDC,可以通過CDC的操作符HDC()來實作:
------------------
HDC hdc=HDC(pDC); //或:HDC hdc=pDC->m_hdc;
170 操作狀态欄,下面以在狀态欄中顯示滑鼠目前坐标為例,代碼如下:
-------------------------------------------------------------------------------------------
CMyView::OnMouseMove(UINT nFlag,CPoint point)
CClientDC dc(this);
CMainFrame *pFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd;
CStatusBar *pStatusBar = (CStatusBar *)&pFrame->m_wndStatusBar;
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); //按文本所需的寬度設定狀态欄寬度
pStatusBar->SetPaneText(nIndex,str);
CView::OnMouseMove(nFlags, point);
173 GetDeviceCaps,一個可得到很多關于指定裝置的具體資訊的函數
174 系統資料庫中:HKEY_CURRENT_USER\KeyboardLayout\preload分支下分别有輸入法對應的1、2、3、4幾個主鍵,其鍵值一一對應已安裝的輸入法,如:1的鍵值00000409是英文輸入法,知道具體輸入法和鍵值的對應關系後,我們可以根據得到的鍵值判斷使用者的目前輸入法了。
176 設定對話框的背景色的簡單方法,其實隻要在CWinapp的InitInstance的裡面添加一行代碼就行了:
---------------------------------------------------------
BOOL CBOOKApp::InitInstance()
SetDialogBkColor(RGB(213,240,227),RGB(173,7,95)); //添加這行,前者為背景色,後者為前景色
.....
178 單文檔程式,如何使程式視窗一開始就固定在某一尺寸:PreCreateWindow中指定大小.可以去掉架構視窗的WS_THICKFRAME風格來使視窗不可改變大小,可以選擇性的去掉WS_MAXIMIZEBO風格。也可以處理WM_GETMINMAXINFO消息來限制視圖的大小。
180 限制使用者調整視窗的最大、最小尺寸,在視窗的WM_GETMINMAXINFO消息響應函數中處理,如:
---------------------------------------------------------------------------
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 擷取桌面所有圖示的标題,代碼示範了如何使用VirtualAlloc(),WriteProcessMemory() 和 ReadProcessMemory() 在不同的程序中配置設定記憶體。用Windows的消息獲得圖示的名稱:
184 字元串轉為Unicode:
-----------------------------------------------------------------
WCHAR wsz[MAX_PATH];
CString str="字元串";
#ifdef _UNICODE
wcscpy(wsz, str); //如果工程支援Unicode的話用wcscpy函數
#else
//工程不支援的話用MultiByteToWideChar函數轉換
MultiByteToWideChar(CP_ACP, 0, str, -1, wsz, MAX_PATH);
#endif
也可以用c的函數庫的函數:
mbtowc 轉一個字元
mbstowcs 轉字元串
185 向一個程序外視窗發送WM_SHOWWINDOW消息,隐藏或顯示該視窗:
-----------------------------------------------------
HWND hwnd=::FindWindow(0,"ddd"); //隐藏"ddd"視窗
::PostMessage(hwnd,WM_SHOWWINDOW,FALSE,SW_OTHERZOOM); //參數3為FALSE時隐藏,為TRUE則顯示該視窗
上面代碼有可能失敗,因為WM_SHOWWINDOW隻是視窗準備改變狀态時,系統發出的消息,并不能控制視窗狀态的改變。另一個方法可以把後面一句改成:ShowWindow(hwnd,SW_HIDE);
187 設定CListCtrl控件圖示間距離的方法:CListCtrl::SetIconSpacing
188 設定層疊視窗的透明色函數: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 關于滾動條方面的,GetScrollInfo獲得滾動條位置資訊:
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);
讓滾動條滾動需要發送相應的WM_VSCROLL和WM_HSCROLL消息:
SendMessage (hwnd, WM_VSCROLL, SB_TOP, 0) ;
SetScrollInfo函數改變滾動條的位置。
190 切換到軟鍵盤:call ImmSetConversionStatus with IME_CMODE_SOFTKBD
191 用 SetVolumeLabel函數修改U盤卷标時據說windows會重新整理裡面的内容。 <===================還沒試
193 打開那個标題為"打開方式..."的對話框來選擇程式:WinExec("rundll32.exe shell32.dll,OpenAs_RunDLL path\filename",SW_RESTORE);
195 從立體聲的wave檔案中分别提出左聲道和右聲道的聲音資料,實作音頻檔案的播放——單聲道錄音、立體聲錄音并儲存為.wav檔案,以及VC.NET簡單實作GIF動畫:
199 讀取其它程序記憶體中的資料:ReadProcessMemory
下面是簡單的代碼:
NOTIFYICONDATA nid;
//初始化系統托盤圖示
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); //圖示
strcpy(nid.szTip, "My Tooltip Text"); //提示
Shell_NotifyIcon(NIM_ADD, &nid);
201 單文檔中列印預覽,發送消息模拟點選菜單中“列印預覽”:
---------------------------------------------------------------------------------
::SendMessage(this->GetSafeHwnd(), WM_COMMAND, ID_FILE_PRINT_PREVIEW, 0);
202 得到目前登陸使用者的使用者名:GetUserName/GetUserNameEx
203 設定發生改變後系統會自動更新,要善加利用:::SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,NULL,NULL);
204 拖動一個沒有标題欄的視窗:
void CMyControl::OnLButtonDown(UINT nFlags, CPoint point)
UNUSED_ALWAYS(nFlags);
if (!(GetWindowLong(m_hWnd, GWL_STYLE) & WS_CHILD))
PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x,point.y));
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 修改菜單項的名稱:
CMenu *pMenu = AfxGetMainWnd()->GetMenu()->GetSubMenu(0);
pMenu->ModifyMenu(0,MF_BYPOSITION,0,"Test");
208 __LINE__表示本行代碼在程式中第幾行,同樣:__FILE__表示目前檔案的全路徑
str.Format("Line is %d", __LINE__); //指這行
AfxMessageBox(str);
209 檢視系統函數的源代碼的方法:裝一個Visual Assist X,想看某個函數的時候ALT + G
210 一直以來,想實作視窗透明程度不同,或局部透明,局部不透明,但這也隻是夢想,下面這個函數看來可以讓我們夢想成真:UpdateLayeredWindow
211 LOGFONT各成員的意義:
LOGFONT lf;
lf.lfHeight=-80; //字型字元的高度
lf.lfWidth=0; //字元平均寬度
lf.lfEscapement=45; //文本行逆時針旋轉45度
lf.lfOrientation=0; //字元角度
lf.lfWeight=FW_HEAVY; //字元的粗細度
lf.lfItalic=FALSE; //傾斜
lf.lfUnderline=FALSE; //下劃線
lf.lfStrikeOut=FALSE; //删除線
lf.lfCharSet=GB2312_CHARSET; //中文字元集
lf.lfOutPrecision=OUT_STROKE_PRECIS; //字型輸出結果和要求的比對程度
lf.lfClipPrecision=CLIP_STROKE_PRECIS; //如何裁剪落于裁剪區之外的字元
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);
215 控制輸入法相關的幾個函數:ImmGetContext、 ImmGetConversionStatus、ImmSetConversionStatus、ImmReleaseContext等
216 限定輸出字元的矩形範圍:ExtTextOut或DrawText
217 控制滾動條的顯示或隐藏:CWnd::ShowScrollBar(UINT nBar,BOOL bShow = TRUE)
218 系統資料庫中:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum下IDE和SCSI分支中枚舉所有這兩種裝置。
219 更改目前時區:SetTimeZoneInformation
獲得目前時區:GetTimeZoneInformation
220 直接讀取硬碟的指定扇區:
(1)用彙編;
221 獲得本機并口的起始位址:
可以讀取bios資料區域,當然隻能在未進入保護模式的作業系統前或 dos下讀取
段位址:00H
408H 字 計算機上0号并行列印機擴充卡的基位址,
40AH 字 計算機上1号并行列印機擴充卡的基位址。
40CH 字 計算機上2号并行列印機擴充卡的基位址。
40EH 字 計算機上3号并行列印機擴充卡的基位址。(PS2型此值為擴充BIOS資料區段位址)
SetupAPI可以得到所有裝置的資訊包括IO端口,記憶體資源,中斷号碼
222 更換桌面背景:
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "c:\\aa.bmp", 1); //jpg圖檔不行,無法顯示
223 讓多行風格的編輯框控件顯示指定行又一法:m_txt.LineScroll(m_txt.GetLineCount()); //m_txt為CEdit控件綁定變量
224 控制音量API:waveOutSetVolume
225 在程式運作期間,怎樣禁止視窗右上方的關閉按鈕
CMenu *pMenu = AfxGetMainWnd()->GetSystemMenu(FALSE) ;
if (pMenu)
pMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND|MF_GRAYED) ;
// 變為非禁止狀态
pMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND|MF_ENABLED) ;
把pMainFrame->ShowWindow(SW_HIDE);這句加在ParseCommandLine(cmdInfo);的後面,if (!ProcessShellCommand(cmdInfo))的前面
228 精确的計時: <========================還沒試
__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 操作臨時檔案,臨時檔案的使用方法基本與正常檔案一樣,隻是檔案名應該調用函數GetTempFileName()獲得。它的第一個參數是建立此臨時檔案的路徑,第二個參數是建立臨時檔案名的字首,第四個參數用于得到建立的臨時檔案名:
char szTempPath[_MAX_PATH],szTempfile[_MAX_PATH];
GetTempPath(_MAX_PATH, szTempPath);
GetTempFileName(szTempPath,_T("my_"),0,szTempfile);
231 彈出USB裝置安全删除對話框:WinExec("C:\\WINDOWS\\system32\\rundll32.exe shell32.dll,Control_RunDLL hotplug.dll",SW_SHOW);
232 彈出“資料連結屬性”對話框:IDataSourceLocatorPtr::PromptNew();
234 CBitmap=====>HBITMAP:
CBitmap bitmap;
HBITMAP hbitmap=(HBITMAP)bitmap; //CBitmap中重載了HBITMAP()操作符,可以友善地用它來強制轉換
HBITMAP=====>CBitmap:
HBITMAP hbitmap;
bitmap.FromHandle(hbitmap);
235 從其它.exe檔案提取.ico圖示作為自己程式的圖示:
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 得到目前螢幕的參數,最好是用函數EnumDisplaySettings(其它的方法如:GetSystemMetrics(SM_CYFULLSCREEN);會因為工作列是否隐藏而可能得不到真實高度),這個函數功能強大,可根據指定的裝置名(第一個參數)傳回它的顯示資訊:
CString strCurrentDifferency,strCurrentColorMode; //分别用來存放螢幕目前分辨率、色彩位數的字元串
LPDEVMODE gpCurrentMode = new DEVMODE; //用來存儲螢幕目前設定的結構指針
EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, gpCurrentMode); //獲得目前分辨率的大小和其它資訊
strCurrentDifferency.Format("分辨率:%d* %d",gpCurrentMode->dmPelsWidth,gpCurrentMode->dmPelsHeight);
strCurrentColorMode.Format("目前顔色位數:%d",gpCurrentMode->dmDisplayFrequency);
AfxMessageBox(strCurrentDifferency);
AfxMessageBox(strCurrentColorMode);
delete gpCurrentMode;
gpCurrentMode=NULL;
用CDC::GetDeviceCaps函數也可以:
-------------------------------------------------------------------------------------------------------
CString strCurrentDifferency;
CDC *pDC=CDC::FromHandle(::GetDC(0)); //随便獲得一個DC指針就可以了,這裡是獲得桌面的DC
strCurrentDifferency.Format("分辨率:%d* %d",pDC->GetDeviceCaps(HORZRES),pDC->GetDeviceCaps(VERTRES));
237 組合框控件在Dropdown類型時,如何設定其為隻讀的:
-----------------------------------------------------------------------------
CComboBox *pCombo = (CComboBox*)GetDlgItem(IDC_COMBO1);
HWND hEdit = ::FindWindowEx(pCombo->GetSafeHwnd(), NULL, _T("EDIT"), NULL);
if (hEdit)
::SendMessage(hEdit, EM_SETREADONLY, TRUE, 0);
239 偵測計算機是否連上網絡:InternetGetConnectedStateEx
240 枚舉軟體或硬體裝置:IMDServiceProvider::EnumDevices
現在沒有列印機可試,記在這裡先,以後有了再測試。
242 結束其它的程序:GetWindowThreadProcessId和 TerminateProcess函數,不過TerminateProcess盡量少用,它可以直接結束目标程序,目标程序死都不知道是自己怎麼死的,來不及儲存自己的資料結果,也來不及通知自己所調用的.dll檔案不用給自己做晚飯了,當然也來不及打電話給它的子程序說:“阿珍,其實我一直都想對你說:我愛你!”
243 用LockFile函數鎖定一個打開檔案的某一個區域,可以防止其它程序通路該區域。
244 使CListCtrl控件的Item标簽可以修改:ModifyStyle(0,LVS_EDITLABELS);
重載CFrameWnd的virtual void GetMessageString(UINT nID, CString& rMessage) const;函數
實作:
void CMainFrame::GetMessageString(UINT nID, CString& rMessage) const
if(nID == ID_FILE_NEW) //這裡可以動态改變
rMessage = "Create new file!";
CFrameWnd::GetMessageString(nID,rMessage); //調用預設的處理過程
對話框工程中:
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或其它子產品的資源,參考下面幾個函數: <===========沒試過,不過看上去可行,用到時再試吧^_^
LoadLibrary
FindResource
LoadResource
LockResource
BeginUpdateResource
UpdateResource
EndUpdateResource
FreeResource
具體見MSDN,上面同時給出了調用順序,看了參數就明白了
247 請問NULL和 null,TRUE和true,FALSE和false等有啥差別?
1.FALSE/TRUE與false/true的差別:
false/true是标準C++語言裡新增的關鍵字,而FALSE/TRUE是通過#define,這要用途是解決程式在C與C++中環境的差異,以下是FALSE/TRUE在windef.h的定義:
#ifndef FALSE
#define FALSE 0
#ifndef TRUE
#define TRUE 1
也就是說FALSE/TRUE是int類型,而false/true是bool類型;是以兩者不一樣的,隻不過我們在使用中沒有這種感覺,因為C++會幫你做隐式轉換。
2.bool的大小與BOOL的差別:
bool在C++裡是占用1位元組,而BOOL是int類型,int類型的大小是視具體環境而定的;是以來說:false/true隻占用1個位元組,而 TRUE/FALSE視具體環境而言
248 CFile::GetStatus也可以獲得檔案的屬性資訊
249 擷取桌面所有頂級視窗:EnumDesktopWindows、EnumWindowsProc
250 顯示用DirectShow捕捉下來的視訊:
DirectShow的 IVideoWindow可以設定
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 改變編輯框控件中光标的圖形:
CBitmap* pBitmap = new CBitmap;
pBitmap->LoadBitmap(IDB_HAPPY_BITMAP); //IDB_HAPPY_BITMAP為工程中.bmp資源,大小任意,但顔色超過16色的話色彩會失真
m_editCtrl.CreateCaret(pBitmap); //m_editCtrl為編輯框控件變量
POINT point;
point.x=0;
point.y=0;
m_editCtrl.SetCaretPos(point); //改變光标的位置,以像素為機關
m_editCtrl.ShowCaret();
252 用主題函數改變對話框視窗的可視風格(MSDN上可查到更多這方面的函數):
----------------------------------------------------------------
#include
#pragma comment(lib,"uxtheme.lib")
void CMyDlg::OnTest()
EnableThemeDialogTexture(m_hWnd,ETDT_ENABLE | ETDT_USETABTEXTURE);
Invalidate();
在App的InitInstance中加一行:
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
cmdInfo.m_nShellCommand=CCommandLineInfo::FileNothing; //添加這一句
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
254 關機:ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF, 0 ) <=====還沒試
強制關機ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN or EWX_POWEROFF, 0 );
256 字元串====>日期時間:
COleDateTime dt;
dt.ParseDateTime(_T("2006-2-14 8:00:00"));
SYSTEMTIME st={0};
dt.GetAsSystemTime(st);
//SetLocalTime(&st); //設定電腦中時間
日期時間====>字元串:
st.wYear=2006;
st.wMonth=3;
st.wDay=23;
st.wHour=8;
st.wMinute=30;
st.wSecond=59;
COleDateTime dt(st);
AfxMessageBox(dt.Format());
------------------------------------------------------------------------------------------------
if(MessageBox("确實要休眠嗎?","關機程式",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 在錄音時如何控制錄音屬性中麥克風或者線路輸入的音量
1.mixerGetNumDevs擷取混音裝置數量
2.循環擷取裝置資訊mixerOpen/mixerGetLineInfo
3.根據獲得的MIXERLINE中dwComponentType判斷類型來确定是線入/麥克風
MIXERLINE_COMPONENTTYPE_SRC_LINE/MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE
4.mixerSetControlDetails設定音量
260 用資料總管打開指定檔案夾,并置目标檔案夾為標明狀态:WinExec("explorer /n,/select,f:\\win98", SW_SHOWNORMAL );
261 打開或關閉輸入法:IActiveIME::SetActiveContext
262 提取.exe或.dll檔案中的圖示:ExtractIcon
264 WM_DEVICECHANGLE消息配合 DeviceIoControl函數可禁用U盤
265 判斷編輯框控件是否為隻讀的:
CEdit *temp=(CEdit *)GetDlgItem(IDC_EDIT1);
DWORD a=temp->GetStyle();
if(a & ES_READONLY) //ES_READONLY=0x800
AfxMessageBox("Read only");
AfxMessageBox("NOT read only");
266 獲得系統電源狀态:
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.
上面URL中MSDN給出了所有按鍵的ASCII碼。
VK_LSHIFT (A0)
Left SHIFT key
VK_RSHIFT (A1)
Right SHIFT key
int percent = 50;
char buf[100];
sprintf(buf, "%d%%%% complete\n! ", percent);
printf(buf); //這樣就隻列印一個%了
printf("%s",buf); //改成這樣後列印出兩個%了,恰如我們期望的
但是問題是KeStallExecutionProcessor的文檔說,他的最小周期不能大于 50微秒!不然會造成系統停頓。。
測試得出 KeStallExecutionProcessor(416)在有的機器上會造成滑鼠停頓 -_-但是KeDelayExecutionThread(KernelMode, FALSE, &WaitTime); 無論再怎麼設定小的逾時,結果都如下10毫秒???差太多了吧。。。
272 向控件發送滑鼠滾輪的消息:
::SendMessage(m_cListCtrl.m_hWnd,WM_MOUSEWHEEL,(WPARAM)-7864320,0); //參數三是向下滾動的參數,7864320則為向上滾動
273 數日前收到天影朋友的23種設計模式的例子,很淺顯易懂。下面的blog中亦有設計模式的探讨,借古喻今,文筆不錯,可供參考:
----------------------------------------------------------------------------------
#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 打開控制台界面,寫點文字在上面:
AllocConsole();//打開控制台視窗
HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE);//得到控制台句柄
unsigned long lgsize;
char *strbuf="顯示這行資訊。";
WriteFile(hOutput,strbuf,strlen(strbuf),&lgsize,0);
FreeConsole();//關閉釋放用于輸入新資訊的控制台視窗