好长时间上不了博客,我还以为因为我发表抗日言论账户被删了,编程中好多新经验新发现不能拿出来和朋友们分享,那个急呀。以下是我在工作中积累的一些经验和解决的一些问题,希望能对大家有一点帮助。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值