李sir_Blog

博客园 首页 联系 订阅 管理

(1)mfc程序让程序在任务栏上不显示

ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW)

这样程序运行过程已经加载的时候都不会出现在任务栏上。

2:首先这种写法是让对话框透明时用到的,因为要使窗体拥有透明效果,则窗口必须有WS_EX_LAYERED扩展属性,而一般情况下窗口是不具有WS_EX_LAYERED属性的,所以要加上这个属性

SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
  (GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^WS_EX_LAYERED));
 // vs后期的sdk已经支持下面函数 ,改变透明度很重要。2为LWA_ALPHA
 SetLayeredWindowAttributes(0,180,2);

 

3:获得当前的时间和星期几

CTime t = CTime::GetCurrentTime();

 UINT DayOfWeek[] = {
  LOCALE_SDAYNAME7,   // Sunday
  LOCALE_SDAYNAME1,  
  LOCALE_SDAYNAME2,
  LOCALE_SDAYNAME3,
  LOCALE_SDAYNAME4,
  LOCALE_SDAYNAME5,
  LOCALE_SDAYNAME6   // Saturday
 };

 TCHAR Buffer[255] = {0};

 GetLocaleInfo(LOCALE_USER_DEFAULT,
  DayOfWeek[t.GetDayOfWeek()-1],
  Buffer,
  255);

 m_strDate.Format(_T("%d-%02d-%02d,%s"),t.GetYear(),t.GetMonth(),t.GetDay(),Buffer);

 

 

4:hbitmap是bitmap的指针,相互转换如下

HBITMAP hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP_BUTTON));

 CBitmap bitmap;
 bitmap.Attach( hBitmap );

 BITMAP bit;
 bitmap.GetBitmap(&bit);

当然也可以用FromHandle

注意点:Attach和FromHandle的区别FromHandle得到的指针是临时变,,通过Attach连接的句柄可以长久保留,但通过FromHandle得到的只是暂时的,大概只在一个消息区间内有效,很快便会被删除,所以基本上不能用。我用了FromHandle然后一直出错!!!

 

5:topmost属性的窗口一直在最上面
当需要变成topmost时,可用函数去设置:  
SetWindowPos(wndTopMost,...)。
如果要变过来,可用  
SetWindowPos(wndNoTopMost.....);

 

6:GetSystemMetrics(SM_CXSCREEN);

获得当前桌面的宽

 

7:SetWindowPos(&wndTopMost,
  GetSystemMetrics(SM_CXSCREEN)-200,
  20,
  bit.bmWidth,bit.bmHeight,
  SWP_SHOWWINDOW);

主要用来显示窗体的位置大小等。比如第二三个参数为要从某个坐标开始显示。第四五两个参数为显示的区域大小。

Changes the size, position, and Z order of a child, pop-up, or top-level window. These windows are ordered according to their appearance on the screen. The topmost window receives the highest rank and is the first window in the Z order.

 

8:在设置了窗体背景后。也就是说将整个窗体都用一个图片显示的时候如果窗体中有一些button等。这个时候button的图标是不会覆盖的。必须用ModifyStyle(0, BS_OWNERDRAW);这个来设定可自定义控件风格。这样的话下面多用图片叠加的方式才可以把图片区域弄上去。

ModifyStyle(0, BS_OWNERDRAW);

 

9:MoveWindow(px,py,m_rc1.Width(),m_rc1.Height());

改变指定窗口的位置和大小.对顶窗口来说,位置和大小取决于屏幕的左上角;对子窗口来说,位置和大小取决于父窗口客户区的左上角.

 

10:

m_btnClose.SetBackImg(&m_MemDC,5,7,33,7,5,7,19,13);
 m_btnStart.SetBackImg(&m_MemDC,5,21,33,20,5,21,19,13);
 m_btnStop.SetBackImg(&m_MemDC,5,36,33,36,5,36,19,13);
 m_btnSet.SetBackImg(&m_MemDC,5,50,33,50,5,50,19,13);

 m_btnClose.SetPos( 123,7 );
 m_btnStart.SetPos( 123,21);
 m_btnStop.SetPos( 123,36);
 m_btnSet.SetPos( 123,50);

该处我们自定义一个button类。实例化4个button,通过自定义函数SetBackImg来获得每一个button在一个载入btn中要取到的区域(详细处理通过bitblt来取得要显示的图片部分),这样每一个button的图片都取好了。然后用自定义的SetPos来把图片移动到指定的位置。SetPos中只是调用了movewindow。

 

11:在自定义的button控件中添加OnEraseBkgnd事件。

1.         OnEraseBkgnd()的要求是快速 在里面的绘图程序最好是不要太耗时间因为每当window组件有任何小变动 都会马上呼叫OnEraseBkgnd()

 2.         OnPaint() 是只有在程序有空闲的时候才会被呼叫

3.         OnEraseBkgnd() 是在 OnPaint() 之前呼叫的

 

所以 OnPaint()被呼叫一次之前 可能会呼叫OnEraseBkgnd()好几次

如果我们是一个在做图形化使用者接口的人常会需要把一张美美的图片设为我们dialog的底图把绘图的程序代码放在OnPaint() 之中 可能会常碰到一些问题比方说拖曳一个窗口在我们做的dialog上面一直移动 dialog会变成灰色 直到动作停止才恢复这是因为每次需要重绘的时候 程序都会马上呼叫OnEraseBkgnd() OnEraseBkgnd()就把dialog画成灰色而只有动作停止之后 程序才会呼叫OnPaint() 这时才会把我们要画的底图贴上去这个问题的解法 比较差点的方法是把OnEraseBkgnd() 改写成不做事的function如下所示:

BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)

{

     return TRUE;

}

以上本来是会呼叫CDialog::OnEraseBkgnd() 但是如果我们不呼叫的话程序便不会画上灰色的底色了比较好的做法是直接将绘图的程序从OnPaint()移到OnEraseBkgnd()来做如下所示:

// m_bmpBKGND 為一CBitmap物件且事先早已載入我們的底圖

// 底圖的大小與我們的視窗client大小一致

BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)

{

     CRect rc;

     GetUpdateRect(&rc);

     CDC srcDC;

     srcDC.CreateCompatibleDC(pDC);

     srcDC.SelectObject(m_bmpBKGND);

 

     pDC->BitBlt(rc.left,rc.top,rc.GetWidth(),

          rc.GetHeight(),&srcDC,rc.left,rc.top,SRCCOPY);

     return TRUE;

}


特別要注意的是取得重畫大小是使用GetUpdateRect() 而不是GetClientRect()如果使用GetClientRect() 會把不該重畫的地方重畫

 

12;DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)当要改变自定义控件的框架的时候就会自动进入该函数。如果不重写该函数可能会崩溃。

在右键弹出菜单中选择“add windows message Handler",

找到DrawItem,为其添加消息映射,添加的代码如下:

void CUIButton::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)

结果在使用到CUIButton的地方用SubClassDlgItem就会出问题。

后来调试发现,不应该按照上面的添加此消息的映射,而是为CUIButton类重写DrawItem函数,添

加方法:

在类CUIButton右键,在弹出菜单中选择"Add Virtual Function",弹出的添加虚函数框中选

择"DrawItem",向导为我们生成的代码如下:

void CUIButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)

当要改变自定义控件框架的时候就会调用。会自动进入。

 

13:TRACKMOUSEEVENT tm;
  tm.cbSize = sizeof(TRACKMOUSEEVENT);
  tm.dwFlags = TME_LEAVE;
  tm.hwndTrack = m_hWnd;
  tm.dwHoverTime = 0;
  _TrackMouseEvent(&tm);

判断鼠标驻留,

TRACKMOUSEEVENT  tme;  
 例如:
tme.cbSize  =  sizeof(TRACKMOUSEEVENT);  
tme.dwFlags  =  TME_HOVER;  
tme.hwndTrack  =  hwnd;          //  目标窗口句柄  
tme.dwHoverTime  =  1000;      //  时间  
_TrackMouseEvent(&tme);   
这样,鼠标悬停1秒之后,就会向窗口发出WM_MOUSEHOVER消息了:  
case  WM_MOUSEHOVER:  
               MessageBox(hwnd,  "111111",  "2222222",  MB_OKCANCEL);  
但是一旦WM_MOUSEHOVER消息派发出来以后,就需要再次_TrackMouseEvent的。

注释。因为我们这边的四个button实例。每移动上去是显示一个图片。移出显示另一图片。

其中ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)要自己添加。

 

14:mfc中鼠标拖动窗体

void OnLButtonDown(UINT nFlags, CPoint point)
{
 SendMessage(WM_NCLBUTTONDOWN,HTCAPTION,0);

}

 

15:CFont::CreatePointFont
这个函数提供了一种简单的方法来创建指定字体类型和字体大小

 

16:TextOut直接输出文本

memDC.TextOut(4,35-size.cy/2-8,strText);


 
 

 

posted on 2010-09-15 15:17  李sir  阅读(464)  评论(0编辑  收藏  举报