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条,要发:)
大家可以随便转载和使用,但我希望大家能记住我的信念:只要所有人都能公司自己的智慧,国家幸甚,中华幸甚。