当前位置:  编程技术>c/c++/嵌入式
本页文章导读:
    ▪MFC一些常用消息处理      目标:窗体的形状要是任意的,取自于位图形状。  在任务栏不显示图标,且在托盘处有显示,并能有消息处理,比如右键单击有菜单可以控制。  程序退出时,托盘处不能遗留.........
    ▪初识英特尔线程构建模块之内存管理tbb_malloc      什么是TBB? TBB(Thread Building Blocks)是英特尔发布的一个库,全称为 Threa [...] 来自无觅网络的本博客推荐文章: .........
    ▪Windows API 逐个逐个学(2)---- 常用的Windows基本数据类型       代码来了: 1 /* ************************************ 2 *《精通Windows API》 3 * 示例代码 4 * windata.c 5 * 2.1.1 常用的Windows数据类型 6 **************************************/ 7 8 /* 头文件 */ 9 #include <windows.h>.........

[1]MFC一些常用消息处理
    来源:    发布时间: 2013-10-17

目标:

  • 窗体的形状要是任意的,取自于位图形状。

     

     

  • 在任务栏不显示图标,且在托盘处有显示,并能有消息处理,比如右键单击有菜单可以控制。

     

     

  • 程序退出时,托盘处不能遗留图标。

     

     

  • 窗体可以控制在最顶层。

     

     

  • 窗体可任意拖动

     

     

  • 。。。

     

     

1.让窗体为图片中形状的窗体图片修改如下:

背景色 → (0,0,255) 其他颜色当然可,最好是(255,0,0)(0,255,0)(0,0,255)这三种色。

步骤:

1.建一个MFC应用程序基于对话框,比如MyPet. (生成三个类CAboutDlg,CMyPetApp,CMyPetDlg)

2.为CMyPetDlg添加变量:

 HBITMAP hBitmap;  CBitmap m_bitmap;  CString m_strBkBmp; //为他初始设定一个值比如"res\\1.bmp"

函数void SetupRegion(CDC *pDC, CBitmap &cBitmap, COLORREF TransColor );根据位图设定窗体区域。(函数代码在下面的附录里)

在BOOL CMyPetDlg::OnInitDialog()中加入:

 hBitmap = (HBITMAP)::LoadImage(::AfxGetInstanceHandle(),m_strBkBmp, IMAGE_BITMAP,0,0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);  m_bitmap.Attach(hBitmap);  BITMAP bm;  m_bitmap.GetBitmap(&bm);  CRect rect;  GetWindowRect(&rect);  rect.right = rect.left + bm.bmWidth;  rect.bottom = rect.top + bm.bmHeight;  MoveWindow(&rect);  CClientDC dc(this);  SetupRegion(&dc,m_bitmap,RGB(0,0,255)); //设置区域,将背景透明色不显示

此时完成窗体形状的设计。不过对话框的风格是要改变一下才行的。在属性中将Border设置为None.

现在生成的只有位图形状的窗体,却没有位图的显示。在OnPaint()中要加如以下代码:

void CMyPetDlg::OnPaint() {  if (IsIconic())  {   ...;  }  else  {

  CPaintDC dc(this);   CDC picDC;   picDC.CreateCompatibleDC(&picDC);

  CBitmap * pOldBmp;   pOldBmp = picDC.SelectObject(&m_bitmap);

  BITMAP bm;   m_bitmap.GetBitmap(&bm);   dc.BitBlt (0,0,bm.bmWidth ,bm.bmHeight,&picDC,0,0,SRCCOPY);   dc.SelectObject(pOldBmp);
 } }

图片显示出来了!

2.程序在任务栏无图标,在托盘有图标:

步骤:

1.为类CMyPetDlg添加变量

NOTIFYICONDATA nid;

2.去掉在任务栏显示的图标

 //使任务栏中不显示图标  DWORD dwEx WS_EX_TOOLWINDOW;
 SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,dwExStyle);

3.托盘图标显示

在CMyPetDlg::OnInitDialog()调用Tray();

// // 托盘图标显示 // void CMyPetDlg::Tray(void) {  nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);  nid.hWnd=this->m_hWnd;  nid.uID=IDR_MAINFRAME;  nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;  nid.uCallbackMessage=WM_SHOWTRAY; //自定义的消息名称  nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));  lstrcpy(nid.szTip, "我的小秘书~" ); //信息提示条为"我的小秘书~"     Shell_NotifyIcon(NIM_ADD,&nid); //在托盘区添加图标  ShowWindow(SW_HIDE); //隐藏主窗口 }

自定义的消息WM_SHOWTRAY:

①在StdAfx.h里加入#define WM_SHOWTRAY (WM_USER+100)

②为类CMyPetDlg添加WM_SHOWTRAY处理函数

 afx_msg LRESULT OnShowTray(WPARAM wParam, LPARAM lParam);

③在类CMyPetDlg实现文件里消息映射里加

 ON_MESSAGE(WM_SHOWTRAY, OnShowTray)

④实现OnShowTray函数(代码在下面附录里)

4.程序退出自动将图标删除,将OnCancel()重写

// // 程序退出处理 // void CMyPetDlg::OnCancel() {  // TODO: 在此添加命令处理程序代码  Shell_NotifyIcon(NIM_DELETE, &nid); //此时删除的nid与之前的是同一个NOTIFYICONDATA结构,否则删不掉,要鼠标再移上去一次才消失  EndDialog(IDCANCEL); }

3.为窗体添加右击菜单处理

注意:首先要重载对话框中的OnInitMenuPopup()函数,在对话框中使用CFrameWnd::OnInitMenuPopup()的函数,否则,菜单命令无法实现。将函数重写后代码在下面的附录里。

步骤:

1.重写函数OnInitMenuPopup()

2.处理WM_NCRBUTTONDOWN消息

// // 右键消息处理 // void CMyPetDlg::OnNcRButtonDown(UINT nHitTest, CPoint point) {  // TODO: 在此添加消息处理程序代码和/或调用默认值  CMenu MenuPop;  CMenu *pMenu;  CPoint pt;  pt = point;  MenuPop.LoadMenu(IDR_MENU2); //自己定义的一个菜单  pMenu = MenuPop.GetSubMenu(0);  pMenu->SetDefaultItem(ID_POP_TOP); //将ID_POP_TOP设置为默认的选择(加粗)  pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
  pt.x, pt.y, this);

 CDialog::OnNcRButtonDown(nHitTest, point); }

4.使窗体被任意拖动

 1.处理WM_NCHITTEST消息

// // 非客户区拖动 // UINT CMyPetDlg::OnNcHitTest(CPoint point) {  // TODO: 在此添加消息处理程序代码和/或调用默认值  UINT nResult = CDialog::OnNcHitTest(point);

 return nResult == HTCLIENT ? HTCAPTION : nResult; }

5.设置动画光标

1.为类CMyPetDlg添加变量

 HCURSOR m_hCursor; //光标句柄  CString m_strCursor; //光标的路径,初始化为"res\\1.ani"

2.处理WM_SETCURSOR消息

// 设置光标

BOOL CMyPetDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) {  // TODO: 在此添加消息处理程序代码和/或调用默认值  if(!m_hCursor)  {   m_hCursor = LoadCursorFromFile(m_strCursor);  }  SetCursor(m_hCursor);  //return CDialog::OnSetCursor(pWnd, nHitTest, message);  return TRUE; }

6.使窗体置于顶层

1.添加变量

BOOL m_bTopMost; //初始为FALSE

// // 是否置于顶层 // void CMyPetDlg::OnPopTop() {  // TODO: 在此添加命令处理程序代码  CRect rect;  GetWindowRect(&rect);  if(!m_bTopMost)  {   ::SetWindowPos(m_hWnd,HWND_TOPMOST,rect.left,rect.top,rect.Width(),rect.Height(),    SWP_SHOWWINDOW);  }  else  {   ::SetWindowPos(m_hWnd,HWND_NOTOPMOST,rect.left,rect.top,rect.Width(),rect.Height(),    SWP_SHOWWINDOW);   }  m_bTopMost = ! m_bTopMost; }

void CMyPetDlg::OnUpdatePopTop(CCmdUI *pCmdUI) {  // TODO: 在此添加命令更新用户界面处理程序代码  pCmdUI->SetCheck(m_bTopMost); }

7.最小化处理

1.添加变量

BOOL m_bIsMin; //是否已最小化初始为FALSE

2.菜单项消息处理

// // 最小最大处理 // void CMyPetDlg::OnPopMin() {  // TODO: 在此添加命令处理程序代码  if(!m_bIsMin)  {   ShowWindow(SW_HIDE);  }  else   ShowWindow(SW_SHOW);  m_bIsMin = ! m_bIsMin; }

void CMyPetDlg::OnUpdatePopMin(CCmdUI *pCmdUI) {  // TODO: 在此添加命令更新用户界面处理程序代码  if(m_bIsMin) //如果之前

    
[2]初识英特尔线程构建模块之内存管理tbb_malloc
    来源:    发布时间: 2013-10-17
什么是TBB? TBB(Thread Building Blocks)是英特尔发布的一个库,全称为 Threa [...] 来自无觅网络的本博客推荐文章:
WordPress多说评论插件严重问题
浅析epoll – epoll例子以及分析
为何python现在越来越多的人在用了?
[转]联通IM软件沃友多图详细评测
[WP主题]简洁大方多色彩的主题——blogolife 无觅
    
[3]Windows API 逐个逐个学(2)---- 常用的Windows基本数据类型
    来源:    发布时间: 2013-10-17

 代码来了:

1 /* ************************************
2 *《精通Windows API》
3 * 示例代码
4 * windata.c
5 * 2.1.1 常用的Windows数据类型
6 **************************************/
7
8 /* 头文件 */
9 #include <windows.h>
10 #include <stdio.h>
11
12 /* ************************************
13 * 功能 Windows 数据类型演示
14 **************************************/
15 int WINAPI WinMain(
16 HINSTANCE hInstance,
17 HINSTANCE hPrevInstance,
18 LPSTR lpCmdLine,
19 int nCmdShow
20 )
21 {
22 //定义字符串
23 LPSTR szString = "Windows data type, string.";
24 //定义字符数组
25 CHAR lpString[120];//要大于szString的长度
26 //定义DWORD类型的数据
27 DWORD dwMax = 0xFFFFFFFF;
28 DWORD dwOne = 0x1;
29 //定义INT类型的数据
30 int iMax = 0xFFFFFFFF;
31 INT iOne = 0x1;
32
33 //显示字符串
34 MessageBox(NULL,szString,"LPSTR",MB_OK);
35 //复制内存,将字符串复制到数组中(包括NULL结束符)
36 CopyMemory(lpString, szString,lstrlen(szString)+1);
37 //显示复制的字符串
38 MessageBox(NULL,lpString,"CHAR[]",MB_OK);
39
40 //比较DWORD并显示结果
41 if(dwMax>dwOne)
42 {
43 MessageBox(NULL,"DWORD类型的数据 OxFFFFFFFF > 0x1","DWORD",MB_OK);
44 }
45 //比较INT并显示结果
46 if(iMax<iOne)
47 {
48 MessageBox(NULL,"INT类型的数据 OxFFFFFFFF < 0x1","INT",MB_OK);
49 }
50 return 0;
51 }

  这个程序中用了4种windows数据类型.

  LPSTR类型的数据是字符串,也就是字符指针. CHAR是字符类型.

  DWORD是32位无符号整数,INT是32位有符号整数.

  运行结果:

  

  

  

     

本文链接


    
最新技术文章:
▪C++单例模式应用实例
▪C++设计模式之迭代器模式
▪C++实现动态分配const对象实例
▪C++设计模式之中介者模式
▪C++设计模式之备忘录模式
▪C++插入排序算法实例
▪C++冒泡排序算法实例
▪C++选择排序算法实例
▪C++归并排序算法实例
▪C++设计模式之观察者模式
▪C++中复制构造函数和重载赋值操作符总结
▪C++设计模式之状态模式
▪C++设计模式之策略模式
▪C++设计模式之访问者模式
▪C++设计模式之模板方法模式
▪C++实现下载的代码
▪C++模板之特化与偏特化详解
▪C++实现查壳程序代码实例
▪C语言、C++内存对齐问题详解
▪C语言、C++中的union用法总结
▪C++基于CreateToolhelp32Snapshot获取系统进程实例
▪C++中memcpy和memmove的区别总结
▪C++通过TerminateProess结束进程实例
▪C++内存查找实例
▪C++实现CreatThread函数主线程与工作线程交互的...
▪C++设计模式之桥接模式
▪C++中关键字Struct和Class的区别
▪C++设计模式之组合模式
▪C++ COM编程之什么是组件?
WEB前端 iis7站长之家
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3