- 浏览: 2037138 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (651)
- ACE (35)
- BAT (9)
- C/C++ (116)
- fast-cgi (14)
- COM (27)
- python (59)
- CGI (4)
- C# (2)
- VC (84)
- DataBase (29)
- Linux (96)
- P2P (6)
- PHP (15)
- Web (6)
- Memcached (7)
- IME输入法 (11)
- 设计模式 (2)
- 搜索引擎 (1)
- 个人情感 (4)
- 笔试/面试 (3)
- 一亩三分地 (33)
- 历史 (2)
- 地理 (1)
- 人物 (3)
- 经济 (0)
- 不仅仅是笑哦 (43)
- 小故事大道理 (2)
- http://www.bjdsmyysjk120.com/ (0)
- http://www.bjdsmyy120.com/ (0)
- 它山之石可以攻玉 (15)
- 大学生你关注些什么 (28)
- 数据恢复 (1)
最新评论
-
luokaichuang:
这个规范里还是没有让我明白当浏览器上传文件时,STDIN的消息 ...
FastCGI规范 -
effort_fan:
好文章!学习了,谢谢分享!
com技术简介 -
vcell:
有错误os.walk(strPath)返回的已经是全部的文件和 ...
通过python获取目录的大小 -
feifeigd:
feifeigd 写道注意:文章中的CPP示例第二行 #inc ...
ATL入门:利用ATL编写简单的COM组件 -
feifeigd:
注意:文章中的CPP示例第二行 #include " ...
ATL入门:利用ATL编写简单的COM组件
//CMyWnd.h
#pragma once #include <Windows.h> #include <vector> using namespace std; class CMyWnd { public: CMyWnd(); ~CMyWnd(void); public: typedef LRESULT (CMyWnd::*PFNNORMALPROC)(HWND, UINT, WPARAM, LPARAM); typedef struct tagMsgInfo { UINT m_uMsg; PFNNORMALPROC m_pfunCall; }stMsgInfo, *LPMsgInfo; typedef LRESULT (CMyWnd::*PFNCOMMPROC)(); typedef struct tagCommMsgInfo { UINT m_uMsg; PFNCOMMPROC m_pfunCall; }stCommMsgInfo, *LPCommMsgInfo; public: //注册窗口类 virtual BOOL RegisterClass(LPCTSTR lpszClassName, UINT style, int cbClsExtra, int cbWndExtra, HINSTANCE hInstance, HICON hIcon, HCURSOR hCursor, HBRUSH hbrBackground, LPCTSTR lpszMenuName = NULL, HICON hIconSm = NULL); //创建窗口 virtual BOOL Create(DWORD dwExStyle, LPCTSTR lpszWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU nIDorHMenu, HINSTANCE hInst, LPVOID lpParam = NULL); //Command消息循环 virtual LRESULT CmdProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); //消息循环 static LRESULT WINAPI WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); public: BOOL ShowWindow(int nCmdShow); public: BOOL InitMsgFunList(); BOOL AddCommandMsg(UINT uMsg, PFNNORMALPROC pfunCall); BOOL AddNoramlMsg(UINT uMsg, PFNNORMALPROC pfunCall); BOOL AddCommonMsg(UINT uMsg, PFNCOMMPROC pfunCall); public: //窗口响应消息 virtual LRESULT OnCreate(); virtual LRESULT OnPaint(); virtual LRESULT OnDestroy(); public: //辅助调用的函数 virtual LRESULT OnDraw(HDC hdc, PAINTSTRUCT& ps); public: HWND m_hWnd;//保存窗口句柄 private: WNDCLASSEX m_wndClass;//保存注册窗口类 TCHAR m_szClassName[MAX_PATH];//保存窗口类的名称 //消息列表 vector<stMsgInfo> m_vtMsgInfo;//消息列表 vector<stMsgInfo> m_vtCmdInfo;//Command消息列表 vector<stCommMsgInfo> m_vtCommInfo;//常见的消息列表 };
//CMyWnd.cpp
#include "mywnd.h" #include <tchar.h> #include <stdio.h> #pragma warning(disable: 4311) #pragma warning(disable: 4312) #pragma warning(disable: 4018) CMyWnd::CMyWnd() { m_hWnd = NULL; m_vtMsgInfo.clear(); m_vtMsgInfo.clear(); //添加常见消息映射 InitMsgFunList(); } CMyWnd::~CMyWnd(void) { } BOOL CMyWnd::InitMsgFunList() { AddCommonMsg(WM_CREATE, OnCreate); AddCommonMsg(WM_PAINT, OnPaint); AddCommonMsg(WM_DESTROY, OnDestroy); return TRUE; } BOOL CMyWnd::RegisterClass(LPCTSTR lpszClassName, UINT style, int cbClsExtra, int cbWndExtra, HINSTANCE hInstance, HICON hIcon, HCURSOR hCursor, HBRUSH hbrBackground, LPCTSTR lpszMenuName, HICON hIconSm) { //初始化WNDCLASSEX ::memset(&m_wndClass, 0, sizeof(m_wndClass)); m_wndClass.cbSize = sizeof(m_wndClass); m_wndClass.style = style; m_wndClass.cbClsExtra = sizeof(this); m_wndClass.cbWndExtra = sizeof(this); m_wndClass.hInstance = hInstance; m_wndClass.hIcon = hIcon; m_wndClass.hCursor = hCursor; m_wndClass.hbrBackground = hbrBackground; if (NULL != lpszMenuName) { _tcsncpy(m_szClassName, lpszClassName, MAX_PATH); } else { _stprintf(m_szClassName, "mywnd-%d", rand()); } m_wndClass.lpszClassName = m_szClassName; m_wndClass.lpszMenuName = lpszMenuName; m_wndClass.hIconSm = hIconSm; m_wndClass.lpfnWndProc = CMyWnd::WndProc; if (!::RegisterClassEx(&m_wndClass)) { return FALSE; } return TRUE; } BOOL CMyWnd::Create(DWORD dwExStyle, LPCTSTR lpszWindowName, DWORD dwStyle,int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU nIDorHMenu, HINSTANCE hInst, LPVOID lpParam) { m_hWnd = ::CreateWindowEx(dwExStyle, m_szClassName, lpszWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, nIDorHMenu, hInst, lpParam); if (NULL == m_hWnd) { return FALSE; } //创建完成之后调用OnCreate OnCreate(); SetWindowLong(m_hWnd, GWL_USERDATA, (LONG)this); ::ShowWindow(m_hWnd, SW_NORMAL); ::UpdateWindow(m_hWnd); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return TRUE; } BOOL CMyWnd::ShowWindow(int nCmdShow) { if (!::IsWindow(m_hWnd)) { return FALSE; } return ::ShowWindow(m_hWnd, nCmdShow); } LRESULT CMyWnd::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { int i = 0; LONG lVal = 0; CMyWnd* pThis = (CMyWnd*)GetWindowLong(hwnd, GWL_USERDATA); if (NULL == pThis) { return ::DefWindowProc(hwnd, uMsg, wParam, lParam); } //执行Command消息 if (uMsg == WM_COMMAND) { return pThis->CmdProc(hwnd, uMsg, wParam, lParam); } //执行常见的消息 for (i = 0; i < pThis->m_vtCommInfo.size(); i++) { if (uMsg == pThis->m_vtCommInfo[i].m_uMsg) { return (pThis->*(pThis->m_vtCommInfo[i].m_pfunCall))(); } } //执行普通消息 for (i = 0; i < pThis->m_vtMsgInfo.size(); i++) { if (uMsg == pThis->m_vtMsgInfo[i].m_uMsg) { return (pThis->*(pThis->m_vtMsgInfo[i].m_pfunCall))(hwnd, uMsg, wParam, lParam); } } return ::DefWindowProc(hwnd, uMsg, wParam, lParam); } LRESULT CMyWnd::CmdProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { int i = 0; //执行普通消息 for (i = 0; i < m_vtCmdInfo.size(); i++) { if (uMsg == m_vtCmdInfo[i].m_uMsg) { return ( this->*(m_vtCmdInfo[i].m_pfunCall) )(hwnd, uMsg, wParam, lParam); } } return ::DefWindowProc(hwnd, uMsg, wParam, lParam); } BOOL CMyWnd::AddCommandMsg(UINT uMsg, PFNNORMALPROC pfunCall) { stMsgInfo msgInfo = {uMsg, pfunCall}; m_vtCmdInfo.push_back(msgInfo); return TRUE; } BOOL CMyWnd::AddNoramlMsg(UINT uMsg, PFNNORMALPROC pfunCall) { stMsgInfo msgInfo = {uMsg, pfunCall}; m_vtMsgInfo.push_back(msgInfo); return TRUE; } BOOL CMyWnd::AddCommonMsg(UINT uMsg, PFNCOMMPROC pfunCall) { stCommMsgInfo msgInfo = {uMsg, pfunCall}; m_vtCommInfo.push_back(msgInfo); return TRUE; } LRESULT CMyWnd::OnCreate() { return DefWindowProc(m_hWnd, WM_CREATE, 0, 0); } LRESULT CMyWnd::OnPaint() { HDC hdc = NULL; PAINTSTRUCT ps = {0}; hdc = BeginPaint(m_hWnd, &ps); OnDraw(hdc, ps); EndPaint(m_hWnd, &ps); return S_OK; } LRESULT CMyWnd::OnDestroy() { ::PostQuitMessage(0); return S_OK; } LRESULT CMyWnd::OnDraw(HDC hdc, PAINTSTRUCT& ps) { return S_OK; }
发表评论
-
__declspec(novtable) 的用法
2010-11-27 14:37 1593__declspec(novtable) 的用法 __d ... -
解决URLDownloadToFile缓存问题的两种方法
2010-09-09 15:18 2926解决URLDownloadToFile缓存问题的两种方法 ... -
修改richedit背景
2010-07-19 22:52 1654RichEditCtrl::SetBackgroundCo ... -
使用ADO封装类的数据库程序开发实例(下)
2010-07-12 15:30 1482使用ADO封装类的数据库 ... -
使用ADO封装类的数据库程序开发实例(上)
2010-07-12 15:28 1220使用ADO封装类的数据库 ... -
VC防止窗口和控件闪烁的方法
2010-07-09 21:16 20331、将Invalidate()替换为Invalidate ... -
防止窗口闪烁地办法
2010-07-09 21:13 1519防止窗口闪烁地办法 也许我们都碰到过这种情况,当你 ... -
使用ADO _ConnectionPtr
2010-07-06 16:04 5273// GetUser.cpp : Defines the ... -
VC用ADO访问数据库全攻略
2010-07-06 15:29 1805VC用ADO访问数据库全 ... -
深入GetMessage和PeekMessage (引自-MSDN技术组)
2010-06-10 16:59 3735深入GetMessage和PeekMessage (引自 ... -
界面编程总结(1)
2010-06-02 13:32 4018原文地址:http://blog.csdn.net/byx ... -
获取信息的有关Windows API
2010-05-27 10:01 3155获取信息的有关Windows API 1.窗口信息 ... -
VC中如何实现窗口的隐藏
2010-05-13 10:08 7879VC中如何实现窗口的隐藏 用MFC做的Dialog ... -
SetConsoleCtrlHandler 处理控制台消息
2010-05-07 17:32 18175SetConsoleCtrlHandler 处理控制台消 ... -
解决决错误: error C2850: 'PCH header file'
2010-04-27 19:45 1960解决决错误: error C2850: 'PCH hea ... -
VC++ GDI+编程的字体和文本绘制
2010-04-13 13:12 7990字体是文字显示和打印的外观形式,它包括了文字的字样、风格和尺寸 ... -
VC利用GDI+显示透明的PNG图片
2010-04-12 16:59 115581.在你将要使用GDI+的工程中,完成初始化 ... -
GDI+编程基础(一)GDI+ Vs GDI
2010-04-12 15:59 2342下载源代码一、GDI GDI是位于应用程序与不同硬件之间 ... -
VC画图
2010-04-12 15:50 1548BOOL DrawPic(HDC hdc, TCHAR* ... -
对话框的数据交换--MFC深入浅出
2010-04-12 10:43 2469对话框数据交换指以下两种动作,或者是把内存数据写入对应的控 ...
相关推荐
MFC程序的核心是消息循环,我们需要确保在消息循环中能够接收到并处理定时器消息。这可以通过在消息映射(message map)中添加ON_MESSAGE宏来实现。 5. **结束缓动**: 当缓动动画到达终点时,停止定时器,以防止...
通过`DECLARE_MESSAGE_MAP()`和`BEGIN_MESSAGE_MAP()`,`CMyWnd`类将这两个函数与对应的窗口消息关联起来,使得当相应消息发生时,可以自动调用对应的处理函数。 总结来说,MFC在Visual C++中提供了丰富的类库,...
例如,创建一个简单的窗口可能如下所示: ```cpp HWND hWnd = CreateWindow(_T("EDIT"), _T("Hello, MFC!"), WS_VISIBLE | WS_CHILD | ES_LEFT, 10, 10, 200, 50, parentWnd, NULL, NULL, NULL); ``` 这里,`...
`BeginPaint()`和`EndPaint()`函数用于初始化和结束绘画过程,它们处理与绘画相关的系统资源,确保正确地处理窗口的paint消息。`BeginPaint()`返回一个`PAINTSTRUCT`结构,包含了关于绘画的信息,而`EndPaint()`则...
在探讨如何通过VC(Visual C++)来获取自身窗口句柄之前,...无论是对窗口大小、位置的调整,还是响应窗口消息,获取窗口句柄都是必不可少的第一步。理解窗口句柄的概念及其获取方法对于Windows应用程序开发至关重要。
2. **消息映射与处理**:在CMyWnd类中,我们需要添加消息映射并实现OnHScroll消息处理函数,这个函数会在滚动条的滑块位置改变时被调用。 ```cpp BEGIN_MESSAGE_MAP(CMyWnd, CWnd) ON_WM_HSCROLL() END_MESSAGE_...
在处理窗口消息时,我们可能还需要响应WM_SIZE消息,这会在窗口大小改变时被触发。在窗口类的`OnSize`方法中,我们可以根据窗口的新尺寸更新内容: ```cpp void CMyWnd::OnSize(UINT nType, int cx, int cy) { ...
当设定的时间间隔到达时,系统会发送`WM_TIMER`消息到窗口的消息队列中。窗口可以通过重写`OnTimer`成员函数来处理这些定时器消息。 ##### 函数原型 ```cpp UINT SetTimer( HWND hWnd, // 定时器所属窗口的句柄 ...
MFC封装了Windows API,提供了面向对象的接口,使得开发者能够更高效地构建和管理窗口、对话框、控件等元素。在这个"MFC.rar"压缩包中,我们主要探讨的是MFC如何创建和销毁窗口,以及非客户区域的相关知识。 首先,...
在`OnSize`消息处理函数中,你需要更新滚动条的范围和页面大小,以适应窗口尺寸的变化。`OnHScroll`和`OnVScroll`函数则用于处理滚动条的操作,如滚动、拖动等。 接下来,我们讨论如何通过GDI+加载图片并设置滚动条...
MFC还提供了一个简单的`MoveWindow`函数,可以直接设置窗口的位置和大小: ```cpp MoveWindow(x, y, newWidth, newHeight, TRUE); ``` 7. `Create`函数参数: 当创建窗口时,可以在`Create`函数的`dwStyle`...
**分层窗口(Layered Windows)**是Windows API提供的一种高级窗口特性,它可以实现窗口的透明度、颜色键、以及自定义绘制等效果。分层窗口有两种模式:普通模式和自绘模式。普通模式下,窗口的透明度由系统处理;而...
在本文中,我们将深入探讨如何使用Microsoft Foundation Classes (MFC) 框架构建一个简单的窗口应用程序。MFC 是微软为 Windows 平台提供的一种 C++ 类库,它封装了 Win32 API,使得开发者可以更高效地编写 Windows ...
`SendMessage`函数会阻塞调用线程直到消息被处理,而`PostMessage`则将消息放入消息队列,调用线程立即返回,稍后在消息循环中处理。这两种方式各有其应用场景,`SendMessage`常用于需要等待结果的操作,而`Post...
MFC是VC++(Visual C++)的一部分,它提供了一种方便的方式来处理窗口、消息和系统资源。下面我们将深入探讨如何在MFC应用中实现窗口闪烁。 首先,窗口闪烁功能主要是通过调用Windows API函数来完成的。最常用的API...
在Microsoft Foundation Classes (MFC)库中,`CWnd`是一个重要的基础类,它封装了Windows API中的`HWND`(窗口句柄)。`CWnd`是所有MFC窗口类(如`CButton`, `CEdit`, `CListBox`等)的基类,用于处理窗口消息和事件...
- **CwinApp的Run**:AfxWinMain继续调用CwinApp的Run函数,该函数负责应用程序的消息循环,处理用户交互和系统事件。 - **程序结束**:当Run函数返回后,AfxWinMain返回到WinMain,此时程序结束执行。 2. **吹...
此外,如果窗口需要响应鼠标和键盘事件,还需要处理相应的消息并进行适当的处理,以确保透明部分能够正确传递事件给底层窗口。 综上所述,通过MFC实现透明窗口并在此基础上进行绘图,需要结合Windows API函数和MFC...
MFC是基于Windows消息机制的,它封装了Windows API中的各种消息处理。在MFC中,消息主要通过`ON_MESSAGE`、`ON_COMMAND`和`ON_BN_CLICKED`等宏来处理,但这些宏只能处理系统预定义的消息。为了处理未在标准消息表中...
- `CMyWnd`类的消息映射机制中,`ON_WM_LBUTTONDOWN`和`ON_WM_PAINT`分别处理鼠标左键点击和窗口重绘事件。 - 当用户点击鼠标左键时,`OnLButtonDown`函数生成一个新的泡泡数据,并更新数组,同时触发重绘。 - `...