好長時間上不了博客,我還以爲因爲我發表抗日言論賬戶被刪了,編程中好多新經驗新發現不能拿出來和朋友們分享,那個急呀。以下是我在工作中積累的一些經驗和解決的一些問題,希望能對大家有一點幫助。

1,使窗體透明可控制
在對話框上新建一個滑動條和一個表示滑動條代表數值的文本框

在BOOL CTransparentDialogDlg::OnInitDialog()添加代碼:

 ::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);//TopMost
 m_sld.SetRange(10,255);
 m_sld.SetPos(128);

 SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
  GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
 HINSTANCE hInst = LoadLibrary("User32.DLL");
 if(hInst)
 {           
  typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);         
  MYFUNC fun = NULL;
  //取得SetLayeredWindowAttributes函數指針    
  fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
  if(fun)fun(this->GetSafeHwnd(),0,128,2);    
  FreeLibrary(hInst);
 }


爲滑動條添加消息響應
void CApi_egDlg::OnReleasedcaptureSlider1(NMHDR* pNMHDR, LRESULT* pResult)
{
 BYTE eff=(BYTE)m_sld.GetPos();
 HINSTANCE hInst = LoadLibrary("User32.DLL");
 if(hInst)
 {           
  typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);         
  MYFUNC fun = NULL;
  //取得SetLayeredWindowAttributes函數指針    
  fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
  if(fun)fun(this->GetSafeHwnd(),0,eff,2);    
  FreeLibrary(hInst);
 }; 

 CString str;
 str.Format("%%%d",100*eff/255);
// InvalidateRect(CRect(10,10,30,30));
 GetDlgItem(IDC_STATIC1)->SetWindowText(str);
 
 *pResult = 0;
}

 

 

 

 

2,在列表上顯示文件夾下的文件名
 int number=0;

 m_List.InsertColumn(0,"文件名",LVCFMT_LEFT,150,-1); //往List控件中插入一列 

 str+="D://*.*";
 bfind=file.FindFile(str);
 while(bfind)
 {
  bfind=file.FindNextFile();

   //如果不是目錄,插入List控件
   str=file.GetFileName();
   m_List.InsertItem(number,str);
   number++;

 }

 

3,爲對話框添加漸入漸出效果
BOOL AnimateWindow(HWND hWnd,DWORD dwTime,DWORD dwFlags)  

/******************************************************************

函數功能:該函數能在顯示與隱藏窗口時產生兩種特殊類型的動畫效果:滾動動畫和滑動動畫。

參數含義:

hWnd:  指定產生動畫的窗口的句柄。

dwTime:指明動畫持續的時間(以微秒計),完成一個動畫的標準時間爲200微秒。
dwFags:指定動畫類型。這個參數可以是一個或多個下列標誌的組合。標誌描述:
AW_SLIDE:使用滑動類型。缺省則爲滾動動畫類型。當使用AW_CENTER標誌時,這個標誌就被忽略。
AW_ACTIVATE:激活窗口。在使用了AW_HIDE標誌後不能使用這個標誌。
AW_BLEND:實現淡出效果。只有當hWnd爲頂層窗口的時候纔可以使用此標誌。
AW_HIDE:隱藏窗口,缺省則顯示窗口。
AW_CENTER:若使用了AW_HIDE標誌,則使窗口向內重疊,即收縮窗口;若未使用AW_HIDE標誌,則使窗口向外擴展,即

展開窗口。
AW_HOR_POSITIVE:自左向右顯示窗口。該標誌可以在滾動動畫和滑動動畫中使用。當使用AW_CENTER標誌時,該標誌

將被忽略。
AW_VER_POSITIVE:自頂向下顯示窗口。該標誌可以在滾動動畫和滑動動畫中使用。當使用AW_CENTER標誌時,該標誌

將被忽略。
AW_VER_NEGATIVE:自下向上顯示窗口。該標誌可以在滾動動畫和滑動動畫中使用。當使用AW_CENTER標誌時,該標誌

將被忽略。


這個函數一般情況不能使用,由於編譯器版本不夠高

使用較簡單的方法是動態載入DLL
先在要是用次函數的頭文件添加
//假如你希望使用ANIWindow,加上,用來爲窗口加入淡入淡出效果
typedef BOOL (WINAPI *lpfnAnimateWindow) (HWND hWnd, DWORD dwTime,DWORD dwFlags);

接下來在OnInitDialog或者在退出函數中添加

 HMODULE hUser32 = GetModuleHandle(_T("USER32.DLL"));
    lpfnAnimateWindow pAni= (lpfnAnimateWindow)GetProcAddress (hUser32, "AnimateWindow");
    if (pAni)
    {
  pAni(GetSafeHwnd(),1000,0x10|0x10000); //200是毫秒數,動畫時間
        Invalidate();    //0x10000表示窗口淡出
      //0x40000表示窗口淡入
      //0x10表示居中
    }


#if(WINVER >= 0x0500)
/*
 * AnimateWindow() Commands
 */
#define AW_HOR_POSITIVE             0x00000001
#define AW_HOR_NEGATIVE             0x00000002
#define AW_VER_POSITIVE             0x00000004
#define AW_VER_NEGATIVE             0x00000008
#define AW_CENTER                   0x00000010
#define AW_HIDE                     0x00010000
#define AW_ACTIVATE                 0x00020000
#define AW_SLIDE                    0x00040000
#define AW_BLEND                    0x00080000

 

 


以下方法相對簡單,已經試過,雖然失敗也可能是自己的原因
BOOL AnimateWindow(
      HWND hwnd,
      DWORD dwTime,
      DWORD dwFlags
  );
  hWnd:指定產生動畫窗口的句柄;
  dwTime:指明動畫持續的時間(以微秒計),完成一個動畫的標準時間爲200微秒;
  dwFags:指定動畫類型。這個參數可以是一個或多個標誌的組合。

dwFlags:

  AW_SLIDE:使用滑動類型。缺省爲滾動類型。使用AW_CENTER標誌時被忽略;

  AW_ACTIVATE:激活窗口。在使用了AW_HIDE標誌後不能使用這個標誌;

  AW_BLEND:實現淡出效果。只有當hWnd爲頂層窗口的時候纔可以使用此標誌;

  AW_HIDE:隱藏窗口,缺省則顯示窗口;

  AW_CENTER:若使用了AW_HIDE標誌,則使窗口向內重疊,即收縮窗口;若未使用AW_HIDE標誌,則使窗口向外擴展

,即展開窗口;

  AW_HOR_POSITIVE:自左向右顯示窗口。該標誌可以在滾動動畫和滑動動畫中使用。當使用AW_CENTER標誌時,該

標誌將被忽略;

  AW_VER_POSITIVE:自頂向下顯示窗口。該標誌可以在滾動動畫和滑動動畫中使用。當使用AW_CENTER標誌時,該

標誌將被忽略;

  AW_VER_NEGATIVE:自下向上顯示窗口。該標誌可以在滾動動畫和滑動動畫中使用。當使用AW_CENTER標誌時,該

標誌將被忽略;

  返回值:如果函數成功,返回值爲非零;如果函數失敗,返回值爲零。
   
    如果:
    1、窗口使用了窗口邊界;
    2、窗口已經可見仍要顯示窗口;
    3、窗口已經隱藏仍要隱藏窗口。
    函數將失敗。

    在STDAFX.H中加入
    #undef WINVER
    #define WINVER 0X500
    否則可能會產生如下錯誤(由於Windows版本問題):
   'AnimateWindow' : undeclared identifier
  'AW_HIDE' : undeclared identifier
  'AW_CENTER' : undeclared identifier

    一個例子:

    void CAboutDlg::OnClose()
    {
           //實現淡出效果。

          AnimateWindow(GetSafeHwnd(),1000,AW_HIDE|AW_BLEND);        

          CDialog::OnClose();

      }

 

 

 

 

4,在Listctrl和Treeview中元素前添加圖標
 CImageList m_HeadIcon;
 CImageList m_image;

 m_image.Create ( IDB_TREEIMAGE,16,1,RGB(255,255,255) );  
 m_treeinfo.SetImageList ( &m_image,TVSIL_NORMAL );   //爲列表或樹添加位圖

// m_HeadIcon.Create(16,16,TRUE,2,2);      
// m_HeadIcon.Add(AfxGetApp()->LoadIcon(IDI_HEAD));   //爲列表或樹添加圖標
// m_treeinfo.SetImageList(&m_HeadIcon,TVSIL_NORMAL); 

 m_treeinfo.SetTextColor (RGB(255,200,0));
 m_treeinfo.SetBkColor(RGB(0,150,200));


在樹列表上雙擊展開節點會自動切換一個圖標,所以一般選擇載入一幅32*16的位圖,只顯示16*16的圖片,當雙擊節

點時,自動顯示另一個16*16的圖形。
如果是圖標的話就無法自動切換,當點擊時,圖標會消失
如果是Listctrl的話使用圖標比較合適

 

 m_HeadIcon.Create(16,16,TRUE,2,2);
 m_HeadIcon.Add(AfxGetApp()->LoadIcon(IDI_HEAD));
 m_list.SetImageList(&m_HeadIcon,LVSIL_SMALL); 

 

 

 

 


5,任務欄隱藏和重現
在對話框類中使用以下函數

FindWindow("Shell_TrayWnd",NULL)->ShowWindow(SW_HIDE);//隱藏任務欄
FindWindow("Shell_TrayWnd",NULL)->ShowWindow(SW_SHOW);//顯示任務欄

 

 

 

 

 


6,獲得系統時間輸入格式不同所產生的影響
 CTime t=CTime::GetCurrentTime();
 m_time.Format("%d年%d月%d日",t.GetYear(),t.GetMonth(),t.GetDay());
 UpdateData(FALSE);


 CTime t=CTime::GetCurrentTime();
 str+=t.Format("%Y%m%d%H%M%S");
注意:不同的大小寫所佔字符長度不同,比如大寫的Y會得到2006,小寫的Y會得到06,但是小寫的m和d如果不足兩位

會在前邊補零,相對來說格式比較統一,很容易在日後編程讀出。
大寫的H、M、S似乎總是兩位,由於時間關係,只測試了S,不過也不知道小寫的s會是什麼情況,1分鐘就前10秒能測

試,一小時就前十分鐘能測試,如果誰有興趣,請告訴我當H、M、S小寫時的時間格式

 

 

 

7,選擇一個文件夾並獲得文件夾路徑
 CString str;
 BROWSEINFO bi;
 char name[MAX_PATH];
 ZeroMemory(&bi,sizeof(BROWSEINFO));
 bi.hwndOwner=GetSafeHwnd();
 bi.pszDisplayName=name;
 bi.lpszTitle="Select folder";
 LPITEMIDLIST idl=SHBrowseForFolder(&bi);
 if(idl==NULL)
  return;
 SHGetPathFromIDList(idl,str.GetBuffer(MAX_PATH));
 str.ReleaseBuffer();
 m_video=str;
 if(str.GetAt(str.GetLength()-1)!='//')
  m_video+="//";
 UpdateData(FALSE);

 

 

 

8,獲得指定像素點的RGB值
 COLORREF rgb;
 BYTE r,g,b; 

 

 rgb=::GetPixel(::GetDC(0),Pos.x ,Pos.y);
 r=GetRValue(rgb);
 g=GetGValue(rgb);
 b=GetBValue(rgb);

 

 


9,窗口狀態
ShowWindow(SW_MINIMIZE);

 

#define SW_HIDE             0
#define SW_SHOWNORMAL       1
#define SW_NORMAL           1
#define SW_SHOWMINIMIZED    2
#define SW_SHOWMAXIMIZED    3
#define SW_MAXIMIZE         3
#define SW_SHOWNOACTIVATE   4
#define SW_SHOW             5
#define SW_MINIMIZE         6
#define SW_SHOWMINNOACTIVE  7
#define SW_SHOWNA           8
#define SW_RESTORE          9
#define SW_SHOWDEFAULT      10
#define SW_FORCEMINIMIZE    11
#define SW_MAX              11

 

 

 

 


10,程序在同一時間僅能有一個在運行
在*.APP文件的初始化裏添加:
    HANDLE m_hMutex=CreateMutex(NULL,TRUE, m_pszAppName);  //程序僅運行一次
    if(GetLastError()==ERROR_ALREADY_EXISTS) { return FALSE; }

 

 

 

 

 

 

11,編譯找不到Mfc42ud.lib的解決辦法
這通常是程序中使用DEBUG _UNICODE造成的,或者是因爲使用win32 unicode debug編譯方式,
解決辦法:
選擇build-->Set Active Configration->選擇Win32 Debug或Win32 Release


還有辦法是找到你的VC安裝包,把裏面的文件夾全拷入VC安裝目錄下,覆蓋同名文件夾,之後再搜索
Mfc42ud.dll放入你的編譯文件夾。安裝VC是默認不安裝UNICODE,只能手動安裝,有人說首次安裝VC時會讓你選擇lib

庫,後來我安裝時就把VC下所有的包全打上對號,問題也能得到解決。

 

 

 

 

12,ADO+Access初始化連接。

 m_pConnection.CreateInstance(__uuidof(Connection));
 m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb",
  "","",adModeUnknown);

 

 

 

 


13,ADO+SQL Server初始化連接
 m_pConnection.CreateInstance(__uuidof(Connection));
// m_pConnection->Open(
// "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial

Catalog=Config;Data Source=SuperPower;",
//  "","",-1);  //當你的SQL服務器登錄方式爲本地系統賬戶登錄時
 m_pConnection->Open(
  "Provider=SQLOLEDB;User ID=sa;Password=;Initial Catalog=Config;Data

Source=192.168.4.179;",
  "","",-1);  //當你的或別人的SQL服務器登錄方時爲身分驗證時

 

 

 

 

14,結構的使用
typedef struct SP
{
 CString a;
 char b;
 char c;
}sp;

 sp ps;
 ps.a="Hello";
 MessageBox(ps.a);

 SP sp;
 sp.a="Hello";
 MessageBox(sp.a);

/////////////////////////////////////////////
typedef struct SP
{
 CString a;
 char b;
 char c;
}*sp;
 sp ps=new SP;   //或者 SP *ps=new SP;
 ps->a="Hello";
 MessageBox(ps->a); 
//////////////////////////////////////////////


struct SP
{
 CString a;
 char b;
 char c;
};     //如果聲明結構體時不加typedef,就不能在其後實例化

 struct SP ps;   //實例化時應該加struct;或者什麼也不加 
 //SP ps;
 ps.a="Hello";
 MessageBox(ps.a);


全局結構體不需要在其他類中用extern聲明
把結構體聲明爲全局或是成員都可以直接調用,不用加extern

 

 

 

 

 

 


15,SPIN按鈕的使用
把一個控件和一個Spin空間放在一起,指定spin的屬性Auto buddy,Set buddy integer

 

經實驗證明,Spin會和任意在他周圍的控件相結合,例如編輯框,普通按鈕,通過Spin都能修改控件的數字

 

 

 

16,多個Radio button的使用方法
添加鼠標單擊消息響應函數,本例演示點擊不同的Radio Button滑動條的位置
void CTestOutputDlg::OnRadio1()
{
 // TODO: Add your control notification handler code here
 m_slider.SetPos(light);
}

ON_COMMAND_RANGE(ID of RADIO first,ID of RADIO last, OnRadiosCmd)

void xxx::OnRadiosCmd(UINT uRadioID)
{
...
}


ON_BN_CLICKED

然後把ON_BN_CLICKED(IDC_RADIO1, OnRadio1)換成
ON_COMMAND_RANGE(IDC_RADIO1,IDC_RADIO4,OnRadio1)

 

 


17,IP轉字符串
CString IptoCString(DWORD dip)
{
 char bcotent[30];
 WORD add1,add2,add3,add4; 
 add1=(WORD)(dip&255);
 add2=(WORD)((dip>>8)&255);
 add3=(WORD)((dip>>16)&255);
 add4=(WORD)((dip>>24)&255);
 sprintf(bcotent,"%d.%d.%d.%d",add4,add3,add2,add1);
 return bcotent;
}


void IptoCString(DWORD dip,char outbuf[20])
{
 ZeroMemory(outbuf,20);
 WORD add1,add2,add3,add4;
 add1=(WORD)(dip&255);
 add2=(WORD)((dip>>8)&255);
 add3=(WORD)((dip>>16)&255);
 add4=(WORD)((dip>>24)&255);
 sprintf(outbuf,"%d.%d.%d.%d",add4,add3,add2,add1);
}

 

 

 

 

 


18,獲得本機IP地址以及主機名。
int CMyQQDlg::GetIpAddress(const CString &sHostName, CString &sIpAddress)//獲得本地IP
{
 struct hostent FAR * lpHostEnt=gethostbyname(sHostName); //獲得計算機名
 if(lpHostEnt==NULL)
 {
  //產生錯誤
  sIpAddress=_T("");
  return GetLastError();
 }
 //獲取IP
 LPSTR lpAddr=lpHostEnt->h_addr_list[0];
 if(lpAddr)
 {
  struct in_addr inAddr;
  memmove(&inAddr,lpAddr,4);
  //轉換爲標準格式
  sIpAddress=inet_ntoa(inAddr);
  if(sIpAddress.IsEmpty())
   sIpAddress=_T("沒有取得");
 }
 return 0;
}

 


今天就寫這麼多吧,圖個吉利,18條,要發:)
大家可以隨便轉載和使用,但我希望大家能記住我的信念:只要所有人都能公司自己的智慧,國家幸甚,中華幸甚。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章