1. 顯示和隱藏標題欄
方法一:使用API實現
//隱藏TitleBar
LONG lStyle = ::GetWindowLong(this->m_hWnd, GWL_STYLE);
::SetWindowLong(this->m_hWnd, GWL_STYLE, lStyle & ~WS_CAPTION);
::SetWindowPos(this->m_hWnd, NULL, 0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
// 顯示TitleBar
::SetWindowLong(this->m_hWnd, GWL_STYLE, lStyle | WS_CAPTION);
::SetWindowPos(this->m_hWnd, NULL, 0, 0, 0, 0,??SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
方法二:使用CWnd成員函數ModifyStyle實現
// 隱藏TitleBar
ModifyStyle(WS_CAPTION, 0, SWP_FRAMECHANGED);
// 顯示TitleBar
ModifyStyle(0, WS_CAPTION, SWP_FRAMECHANGED);
2 . 怎麼用SendMessage()來發送消息來清空它的內容??
HWND hEditWnd=GetDlgItem(IDC_EDIT1)->GetSafeHwnd();
::SendMessage(hEditWnd,WM_SETTEXT,(WPARAM)0,(LPARAM)"");
3. 彈出文件的屬性窗口
SHELLEXECUTEINFO ShExecInfo ={0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = "propertIEs";
ShExecInfo.lpFile = "c:"; //也可以是文件
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
4. 刪除一個目錄下的所有文件
方法一:
BOOL DeleteDirectory(LPCTSTR DirName)
{
CFileFind tempFind; //聲明一個CFileFind類變量,以用來搜索
char tempFileFind[200]; //用於定義搜索格式
sprintf(tempFileFind,"%s*.*",DirName);
//匹配格式為*.*,即該目錄下的所有文件
BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
//查找第一個文件
while(IsFinded)
{
IsFinded=(BOOL)tempFind.FindNextFile(); //遞歸搜索其他的文件
if(!tempFind.IsDots()) //如果不是"."目錄
{
char foundFileName[200];
strcpy(foundFileName,tempFind.GetFileName().GetBuffer(200));
if(tempFind.IsDirectory()) //如果是目錄,則遞歸地調用
{
//DeleteDirectory
char tempDir[200];
sprintf(tempDir,"%s\%s",DirName,foundFileName);
DeleteDirectory(tempDir);
}
else
{
//如果是文件則直接刪除之
char tempFileName[200];
sprintf(tempFileName,"%s\%s",DirName,foundFileName);
DeleteFile(tempFileName);
}
}
}
tempFind.Close();
if(!RemoveDirectory(DirName)) //刪除目錄
{
AfxMessageBox("刪除目錄失敗!",MB_OK);
return FALSE;
}
return TRUE;
}
方法二:(不使用MFC,在WTL/ATL中)
#ifdef INVALID_HANDLE_VALUE
#undef INVALID_HANDLE_VALUE
#define INVALID_HANDLE_VALUE ((HANDLE)((LONG_PTR)-1))
#endif
#define FILE_ATTRIBUTE_DIRECTORY 0x00000010
int DeleteDirectory(wchar_t* RemovePath)
{
if(RemovePath == NULL)
return 0;
if(wcslen(RemovePath) > (MAX_PATH - 5))
return 0;
wchar_t pcRoot[MAX_PATH+1]; //this dir
wchar_t pcTemp[MAX_PATH+1]; //this dir with "*.*" appended
_tcscpy(pcRoot,RemovePath);
int n;
n = wcslen(pcRoot);
if(pcRoot[n-1]!='\')
{
pcRoot[n] = '\';
n++;
pcRoot[n] = '';
}
_tcscpy(pcTemp,pcRoot);
wcscat(pcTemp,_T("*.*"));
WIN32_FIND_DATA f;
LPWIN32_FIND_DATA pf;
pf = (LPWIN32_FIND_DATA)&f;
HANDLE h;
h = FindFirstFile(pcTemp,pf);
if(h==INVALID_HANDLE_VALUE)
return 0;
BOOL b;
b = TRUE;
while(b)
{
if(wcscmp(f.cFileName,_T("."))==0 || wcscmp(f.cFileName,_T(".."))==0)
{
b = FindNextFile(h,pf);
continue;
}
wcscpy(pcTemp,pcRoot);
wcscat(pcTemp,f.cFileName);
if(f.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
{
DeleteDirectory(pcTemp);
_wrmdir(pcTemp);
}
else
DeleteFile(pcTemp);
b = FindNextFile(h,pf);
}
FindClose(h);
return 1;
}
5.lib和dll文件的區別和聯系
.dll是在你的程序運行的時候才連接的文件,因此它是一種比較小的可執行文件格式,.dll還有其他的文件格式如.ocx等,所有的.dll文件都是可執行。
.lib是在你的程序編譯連接的時候就連接的文件,因此你必須告知編譯器連接的lib文件在那裡。一般來說,與動態連接文件相對比,lib文件也被稱為是靜態連接庫。當你把代碼編譯成這幾種格式的文件時,在以後他們就不可能再被更改。如果你想使用lib文件,就必須:
1 包含一個對應的頭文件告知編譯器lib文件裡面的具體內容
2 設置lib文件允許編譯器去查找已經編譯好的二進制代碼
如果你想從你的代碼分離一個dll文件出來代替靜態連接庫,仍然需要一個lib文件。這個lib文件將被連接到程序告訴操作系統在運行的時候你想用到什麼dll文件,一般情況下,lib文件裡有相應的dll文件的名字和一個指明dll輸出函數入口的順序表。如果不想用lib文件或者是沒有lib文件,可以用WIN32 API函數LoadLibrary、GetProcAddress。事實上,我們可以在Visual C++ IDE中以二進制形式打開lib文件,大多情況下會看到ASCII碼格式的C++函數或一些重載操作的函數名字。
一般我們最主要的關於lib文件的麻煩就是出現unresolved symble 這類錯誤,這就是lib文件連接錯誤或者沒有包含.c、.cpp文件到工程裡,關鍵是如果在C++工程裡用了C語言寫的lib文件,就必需要這樣包含:
extern "C"
{
#include "myheader.h"
}
這是因為C語言寫的lib文件沒有C++所必須的名字破壞,C函數不能被重載,因此連接器會出錯。