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在高版本中引入了消息反射的koa 源码概念。通过消息反射机制,子控件窗口能够自行处理与自身相关的一些消息,增强了封装性,同时也提高了子控件窗口类的可重用性。需要注意的是,消息反射仅在MFC实现,需类从CWnd类派生才能工作。
消息反射的实现需要了解Message-Map宏和函数原型。一般消息前缀为ON_,cltphp 源码后面加上_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。unityfps源码否则,AFX_NOTIFY对象被创建并调用OnCmdMsg函数处理。ReflectLastMsg函数负责调用发送窗口的SendChildNotifyLastMsg方法。SendChildNotifyLastMsg调用发送窗口的OnChildNotify虚拟函数进行处理,若未重载,将调用ReflectChildNotify函数进行标准的反射消息消息映射处理。
消息反射机制不是难以理解的概念,它的引入是为了提高子控件的重用性和封装性。对于特定消息,fuchsiaos源码可通过重载对应的虚函数处理,或使用标准的反射消息映射处理。文章内容已涵盖消息反射的基础知识、由来、处理流程以及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;
}
2024-12-28 18:45
2024-12-28 18:20
2024-12-28 18:07
2024-12-28 17:48
2024-12-28 16:46