1. 程式人生 > >VC程式設計經驗彙總

VC程式設計經驗彙總

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;
  }

  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函式不能被過載,因此聯結器會出錯。