【共振 源码】【iapp源码贩卖机】【源码这么上传到空间】cwnd源码

时间:2024-12-28 19:35:12 来源:地产项目管理源码 分类:焦点

1.Windows 中不规则窗体的编程实现
2.消息反射消息反射的源码基础知识
3.CRuntimeClass生成类
4.求VB写的循环人名抽奖程序源代码
5.WindowProc和DefWindowProc的区别

cwnd源码

Windows 中不规则窗体的编程实现

          Windows 中不规则窗体的编程实现          ä¸‹è½½æºä»£ç      ä¸€ 序言     ã€€ã€€åœ¨ç»å¤§å¤šæ•°çš„Windows应用程序中 其窗体都是使用的正规正矩的矩形窗体 例如我们常用的 记事本 扫雷 等等 矩形窗体 具有编程实现简单 风格简洁的优点 所以在普通文档应用程序和简单小游戏中使用足矣 但在某些娱乐游戏程序中使用就略显呆板些了 这时若用不规则窗体替代原先的矩形窗体 将会使这类程序更添情趣 典型的例子有windows 自代的Media Player 新版本的Media Player有个控制面板的选项 选中这些面板 播放器就以选中的面板形状出现 这时的播放器比以前版本的Media Player的古老矩形界面要生动有趣的多了 要实现不规则窗体不是太难 知道了基本原理后 你也可以创建各种有趣的不规则窗体           äºŒ 实现原理          ã€€ã€€æ‰€æœ‰çš„ Windows 窗体都位于一个称为 region 中 窗体的大小如果超出 region 的范围 windows会自动裁剪超出"region"范围那部分的窗体 使其不可见 所以 要创建不规则窗体有两个步骤 第一步就是创建不规则"region" 第二步就是将窗体放到创建的 region 中   其中第二步很简单就调用一条语句即可 在SDK中调用API函数SetWindowRgn 该函数原型如下

          int SetWindowRgn( HWND hWnd HRGN hRgn BOOL bRedraw );

          其中hWnd为待设置的窗体句柄 hRgn为已经创建的"region"句柄 bRedraw代表是否要重绘窗体 在MFC中使用窗口类CWnd的成员函数int CWnd::SetWindowRgn(HRGN hRgn BOOL bRedraw );该函数的参数意义与API中同名函数相同   相对与第二步 创建不规则窗体的第一步要复杂许多 并且不规则窗体越复杂 创建其"region"的过程也越复杂 接下去我们将由浅入深地介绍各种创建 region 的方法      ã€€ã€€åœ¨MFC中"region"对象 由CRgn类实现 CRgn的几乎每个成员函数都有同名的SDK API函数对应 三 简单 region 的创建     ã€€ã€€ç±»CRgn创建一个新的"region"的简单方法有以下几个成员函数

        BOOL CRgn::CreateRectRgn( int x int y int x int y ); 创建矩形的 region        

        BOOL CRgn::CreateEllipticRgn( int x int y int x int y ); 创建圆形或椭圆形 region        

       

        BOOL CRgn::CreateRoundRectRgn( int x int y int x int y int x int y ); 创建圆角矩形 region        

        BOOL CRgn::CreatePolygonRgn( LPPOINT lpPoints int nCount int nMode ); 创建多边形 region

          这里以创建椭圆窗体为例 介绍椭圆窗体创建的方法 在创建椭圆 region 的CreateEllipticRgn函数中 x y 指椭圆所在矩形的左上角坐标 x y 指该矩形的右下角坐标      ã€€ã€€ä¸‹é¢çš„代码加入到MFC对话框程序的OnInitDialog函数中 可将该对话框变成椭圆窗体      

          BOOL CTestDlg::OnInitDialog(){ CDialog::OnInitDialog(); CRgn rgn; rgn CreateEllipticRgn( ); SetWindowRgn(rgn TRUE);}

     å›¾ä¸€ 椭圆窗体效果图     å›› 作图路径法创建 region 使用该方法创建 region 的过程如下 第一步绘制所要创建的窗体形状 该步骤中使用到CDC类中的一些成员函数如下

          BOOL CDC::BeginPath( );

          调用该函数后当前设备环境(DC)开始追踪绘图的过程

          int CDC::SetBkMode( int nBkMode );

          设置绘图时的背景模式 此应用中nBkMode必须取值为TRANSPARENT 即设置绘图时背景不发生变化

          BOOL CDC::EndPath( );

          调用该函数后当前设备环境(DC)结束追踪绘图的过程   开始绘图前 先调用BeginPath 然后调用SetBkMode 接下去就可调用CDC的其他绘图函数作图 例如Arc AngleArc LineTo MoveTo RoundRect Textout等等 绘图完毕调用EndPath() 第二步将绘制的结果转成 region 此步骤中使用SDK API函数

          HRGN PathToRegion( HDC hdc );

          Hdc为作图DC的句柄 CDC类中的m_hDC成员变量可做此参数传入 示例 将下面代码加入某个按钮单击事件中 可以将当前窗体变为字符串 hello 的形状     

          void CTestDlg::OnTest() {    HRGN wndRgn;    CClientDC dc(this);    CFont mFont;        if (dc m_hDC!=NULL)    {        VERIFY(mFont CreateFont(             FW_HEAVY TRUE FALSE             ANS    

lishixinzhi/Article/program/c//

消息反射消息反射的基础知识

       什么是消息反射?在windows环境中,子控件经常向父控件发送消息,源码例如子控件在绘制背景时可能向父窗口发送消息WM_CTLCOLOR。源码在未处理之前,源码父控件会将消息反射回子控件进行处理,源码故此得名:消息反射。源码共振 源码

       消息反射的源码背景是,早期的源码MFC版本中,父窗口(通常是源码对话框)会处理这些消息,这意味着子控件的源码消息处理必须在父窗口类体内完成。添加子控件时,源码代码的源码复制工作落在父窗口类中,导致代码复杂度和臃肿度的源码增加。这样的源码设计使得父窗口成为了一个功能繁多的实体,而子控件则无法独立处理自身消息,源码代码重用性低,对程序员而言是极其不便利的。

       为了解决这个问题,MFC在高版本中引入了消息反射的iapp源码贩卖机概念。通过消息反射机制,子控件窗口能够自行处理与自身相关的一些消息,增强了封装性,同时也提高了子控件窗口类的可重用性。需要注意的是,消息反射仅在MFC实现,需类从CWnd类派生才能工作。

       消息反射的实现需要了解Message-Map宏和函数原型。一般消息前缀为ON_,源码这么上传到空间后面加上_REFLACT。例如,WM_CTLCOLOR处理后为ON_WM_CTLCOLOR_REFLECT;WM_MEASUREITEM变为ON_WM_MEASUREITEM_REFLECT。

       ClassWizard可简化添加消息反射的过程。步骤如下:在ClassWizard中,打开选择项Message Maps;在Class name下拉列表中选择控制类;在Object IDs中选中类名;在Messages一栏找到带有=标记的反射消息;双击鼠标或添加按钮后确认。

       消息处理流程如下:子窗口发送通知消息触发父窗口调用其虚函数CWnd::OnNotify。如果子窗口处理消息,返回TRUE。个人游戏菜单.e源码否则,AFX_NOTIFY对象被创建并调用OnCmdMsg函数处理。ReflectLastMsg函数负责调用发送窗口的SendChildNotifyLastMsg方法。SendChildNotifyLastMsg调用发送窗口的OnChildNotify虚拟函数进行处理,若未重载,将调用ReflectChildNotify函数进行标准的反射消息消息映射处理。

       消息反射机制不是难以理解的概念,它的引入是为了提高子控件的重用性和封装性。对于特定消息,c 优秀开源源码可通过重载对应的虚函数处理,或使用标准的反射消息映射处理。文章内容已涵盖消息反射的基础知识、由来、处理流程以及ClassWizard的使用方法。对于更多细节问题,请参考MFC源代码。

CRuntimeClass生成类

       CRuntimeClass的CreateObject()函数能够动态创建一个类的对象,其功能类似于new关键字,但在某些特定情况下表现出独特的优势。下面通过一个实例来帮助理解。

       假设我们有以下类的定义:

       cpp

       class CWndA : public CWnd

       class CWndB : public CWnd

       在函数function1()中,我们有这样一段代码:

       cpp

       function1()

       {

        CRuntimeClass* pC = RUNTIME_CLASS(CWndA);

        CWnd* result = CreateWnd(pC);

       }

       函数CreateWnd接受一个CRuntimeClass*参数,其内部实现如下:

       cpp

       CWnd* CreateWnd(CRuntimeClass* pClass)

       {

        return static_cast(pClass->CreateObject());

       }

       在这个例子中,CreateWnd返回的是CWnd类型的指针,但实际上它是一个CWndA类型的指针。通过这种方式,你可以从子类指针强制转换为父类指针,无需担心类型转换错误。CRuntimeClass的使用简化了使用switch语句根据不同类创建实例的复杂过程。

       值得注意的是,为了使用CreateObject()的特性,类的定义中需要包含IMPLEMENT_DYNCREATE宏。当你深入理解了这一点并体验到它带来的便利时,你可能会对Microsoft(M$)如何通过宏实现类的动态检测感到惊叹。如果你想深入了解,不妨研究一下MFC(Microsoft Foundation Classes)的源代码。

扩展资料

       CRuntimeClass没有基类。 每个由CObject派生的类都与一个CRuntimeClass结构相联系,用户可以使用该结构获取一个对象及其基类的运行时信息。当需要额外的函数参数检查时,或当用户必须根据一个对象的类编写特殊目的代码时,在运行时确定该对象的类就非常有用。C++并不直接支持运行时类的信息。

求VB写的循环人名抽奖程序源代码

       在定义函数时有时在语句前,有的在语句后。

       希望能帮到你!

       // giftDlg.h : header file

       //

       #if !defined

       #if _MSC_VER >

       #pragma once

       #endif // _MSC_VER >

       // CGiftDlg dialog

       class CGiftDlg : public CDialog

       {

       // Construction

       public:

        int FreeMem();

        int ReSetData();

        int InitData(); //初始化数组

        CGiftDlg(CWnd* pParent = NULL); // standard constructor

        char *code[];//指向身份证号数组的指针

        char *name[];//指向姓名数组的指针

        char data[]; //随机数组

        int ptr; //进度条当前指向随机数组的指针

        int totalid; //参加抽奖的id总数,如果抽出一个,自减1

        bool bstart; //标记进度条是否在滚动

       // Dialog Data

        //{ { AFX_DATA(CGiftDlg)

        enum { IDD = IDD_GIFT_DIALOG };

        CButton m_btgo;

        CString m_code;

        CString m_msg;

        //}}AFX_DATA

        // ClassWizard generated virtual function overrides

        //{ { AFX_VIRTUAL(CGiftDlg)

        protected:

        virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

        //}}AFX_VIRTUAL

       // Implementation

       protected:

        HICON m_hIcon;

        // Generated message map functions

        //{ { AFX_MSG(CGiftDlg)

        virtual BOOL OnInitDialog();

        afx_msg void OnPaint();

        afx_msg HCURSOR OnQueryDragIcon();

        virtual void OnOK();

        afx_msg void OnTimer(UINT nIDEvent);

        afx_msg void OnCancelMode();

        virtual void OnCancel();

        //}}AFX_MSG

        DECLARE_MESSAGE_MAP()

       };

       //{ { AFX_INSERT_LOCATION}}

       // Microsoft Visual C++ will insert additional declarations immediately before the previous line.

       #endif // !defined(AFX_GIFTDLG_H__D8D4EF_F4_4F__FBFF__INCLUDED_)

       // giftDlg.cpp : implementation file

       //

       #include "stdafx.h"

       #include "gift.h"

       #include "giftDlg.h"

       #ifdef _DEBUG

       #define new DEBUG_NEW

       #undef THIS_FILE

       static char THIS_FILE[] = __FILE__;

       #endif

       // CGiftDlg dialog

       CGiftDlg::CGiftDlg(CWnd* pParent /*=NULL*/)

       : CDialog(CGiftDlg::IDD, pParent)

       {

        //{ { AFX_DATA_INIT(CGiftDlg)

        m_code = _T("");

        m_msg = _T("");

        //}}AFX_DATA_INIT

        // Note that LoadIcon does not require a subsequent DestroyIcon in Win

        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

       }

       void CGiftDlg::DoDataExchange(CDataExchange* pDX)

       {

        CDialog::DoDataExchange(pDX);

        //{ { AFX_DATA_MAP(CGiftDlg)

        DDX_Control(pDX, IDOK, m_btgo);

        DDX_Text(pDX, IDC_STATIC_CODE2, m_code);

        DDX_Text(pDX, IDC_STATIC_MSG, m_msg);

        //}}AFX_DATA_MAP

       }

       BEGIN_MESSAGE_MAP(CGiftDlg, CDialog)

       //{ { AFX_MSG_MAP(CGiftDlg)

       ON_WM_PAINT()

       ON_WM_QUERYDRAGICON()

       ON_WM_TIMER()

       ON_WM_CANCELMODE()

        //}}AFX_MSG_MAP

       END_MESSAGE_MAP()

       // CGiftDlg message handlers

       BOOL CGiftDlg::OnInitDialog()

       {

        CDialog::OnInitDialog();

        InitData();

        bstart=false;

        // Set the icon for this dialog. The framework does this automatically

        // when the application's main window is not a dialog

        SetIcon(m_hIcon, TRUE); // Set big icon

        SetIcon(m_hIcon, FALSE); // Set small icon

        // TODO: Add extra initialization here

        m_msg.Format ("按开始键开始滚动,抽奖箱中人数:%d",totalid);

        UpdateData(FALSE);

        return TRUE; // return TRUE unless you set the focus to a control

       }

       // the minimized window.

       HCURSOR CGiftDlg::OnQueryDragIcon()

       {

        return (HCURSOR) m_hIcon;

       }

       void CGiftDlg::OnOK()

       {

        // TODO: Add extra validation here

        if(bstart)

        {

        KillTimer(1);

        bstart=false;

        m_msg.Format ("按开始键开始滚动,抽奖箱中人数:%d",totalid-1);

        m_code.Format ("抽出的号码:%s\n姓名:%s",code[data[ptr]],name[data[ptr]]);

        //AfxMessageBox(m_code);

        ReSetData();//剔除抽出的号码,重新打乱

        if(totalid<1)

        {

        m_btgo.EnableWindow (FALSE);

        }

        m_btgo.SetWindowText ("开始");

        }

        else

        {

        SetTimer(1, ,NULL);

        bstart=true;

        m_msg.Format ("按停止键抽一个奖");

        m_btgo.SetWindowText ("停止");

        }

        UpdateData(FALSE);

        //CDialog::OnOK();

       }

       void CGiftDlg::OnTimer(UINT nIDEvent)

       {

        // TODO: Add your message handler code here and/or call default

        m_code.Format ("现在的号码:%s",code[data[ptr]]);

        UpdateData(FALSE);

        ptr++;

        ptr%=totalid;

        CDialog::OnTimer(nIDEvent);

       }

       void CGiftDlg::OnCancelMode()

       {

        CDialog::OnCancelMode();

        // TODO: Add your message handler code here

       }

       int CGiftDlg::InitData()

       {

        FILE * fp=fopen("id.txt","r");

        ptr=0;

        totalid=1;

        if (fp==NULL)

        {

        return 0;

        }

        char buf[];

        int line=0;

        while(!feof(fp))

        {

        char *p=fgets(buf,,fp);

        if (p!=NULL)

        {

        name[line]=(char*)malloc();

        code[line]=(char*)malloc();

        memset(code[line],0,);

        memset(name[line],0,);

        int flag=0;

        for(int i=0;i<&&buf[i]!='\0';i++)

        {

        if((buf[i]!=',' )&& (flag==0))

        {

        code[line][i]=buf[i];

        }

        else if(flag==0)

        {

        flag=i;

        }

        else if((buf[i]!=',' )&& (flag!=0))

        {

        name[line][i-flag-1]=buf[i];

        }

        }

        TRACE("%s-%s",code[line],name[line]);

        memset(buf,0,);

        line++;

        }

        }

        fclose(fp);

        for(int j=0;j<line;j++)

        {

        data[j]=j;

        }

        for(int i=0;i<line;i++)

        {

        int pos=rand()%(line-i)+i;

        int temp=data[i];

        data[i]=data[pos];

        data[pos]=temp;

        TRACE("%d",data[i]);

        }

        totalid=line;

        return 1;

       }

       int CGiftDlg::ReSetData()

       {

        //ptr剔除,与最后一个交换,然后释放内存

        int line=totalid;

        int temp=data[ptr];

        data[ptr]=data[line-1];

        data[line-1]=temp;

        //AfxMessageBox(name[data[line-1]]);

        free(code[data[line-1]]);

        free(name[data[line-1]]);

        totalid--;

        line--;

        ptr=0;

        for(int i=0;i<line;i++)//重新打乱

        {

        int pos=rand()%(line-i)+i;

        int temp=data[i];

        data[i]=data[pos];

        data[pos]=temp;

        TRACE("%d",data[i]);

        }

       return 1;

       }

       int CGiftDlg::FreeMem()

       {

        int line=totalid;

        for(int i=0;i<line;i++)

        {

        free(code[i]);

        free(name[i]);

        }

        return 1;

       }

       void CGiftDlg::OnCancel()

       {

        // TODO: Add extra cleanup here

        FreeMem();

        CDialog::OnCancel();

       }

       id.txt

       ,章鱼

       ,李光

       X,周瑜

       ,韩信

       ,沈兵

       ,宏志

       X,范进

       ,曾国

       ,乱马

       ,贾海

WindowProc和DefWindowProc的区别

       1.

       WindowProc是你给自己的窗口定义的窗口处理函数

       DefWindowProc是windows平台提供的默认窗口处理函数

       å¦‚果某些消息你不需要做特别的处理,调用DefWindowProc进行处理就可以了,不需要你自己再去些那些windows的"标准动作"

       2.

       æ ¹æ®1,显然,你只能定义WindowProc而不能定义DefWindowProc

       çœ‹çœ‹MFC的CWnd源码就一目了然了

       LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)

       {

       // OnWndMsg does most of the work, except for DefWindowProc call

       LRESULT lResult = 0;

       if (!OnWndMsg(message, wParam, lParam, &lResult)) // 如果消息是需要自己处理的,

       //处理后就不必让windows系统进行默认处理了

       lResult = DefWindowProc(message, wParam, lParam); // 自己没有处理的就交给windows去做

       return lResult;

       }