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條,要發:)
大家可以隨便轉載和使用,但我希望大家能記住我的信念:只要所有人都能公司自己的智慧,國家幸甚,中華幸甚。