1.MFC中的剥皮剥皮InitInstance()函数应该怎样理解
2.QQ返利机器人是骗局吗?
3.邵阳麻将、邵阳剥皮游戏定制需要多少钱?
4.暴殄天物怎么造句
MFC中的源码InitInstance()函数应该怎样理解
不是,是脚本实例的初始化函数;比如分配内存空间啊什么的;
MFC的WinMain
使用MFC编程的程序员刚开始都会提出这样一个问题:我的程序是从哪儿开始执行的?回答是:从WinMain()开始执行的。提出这样的剥皮剥皮问题是由于在他们所编写的MFC应用中看不到WinMain()函数。这个函数是源码隐藏在MFC框架中,MFC的脚本结绳文件源码设计者将它作得很通用(这主要得益于Window的消息驱动的编程机制,使得作一个通用的剥皮剥皮WinMain()很容易),因此在一般情况下,源码无需更改WinMain()的脚本代码,MFC的剥皮剥皮设计者也不提倡程序员修改WinMain()的代码。在MFC中,源码实际实现WinMain()的代码是AfxWinMain()函数(根据其前缀Afx就知道这是一个全局的MFC函数)。
一个Win应用程序(或进程)是脚本由一个或多个并发的线程组成的,其中第一个启动的剥皮剥皮线程称为主线程,在Window下,源码一般将线程分成两大类,脚本界面线程和工作线程,工作线程就是一般的线程,它没有窗口,没有消息队列等,界面线程拥有一个或多个窗口,拥有一个消息队列和其他专属于界面线程的元素。在讨论AfxWinMain()之前,首先要简略提一下MFC中的两个重要的类,CWinThread和CWinApp,CWinThread是用来封装界面线程的类,CWinApp是从CWinThread派生而来的。在CWinThread中,有两个很重要的虚拟函数InitInstance()和ExitInistance(),MFC的程序员应该对这两个函数应该很熟悉。在CWinApp中,增加了另外一个虚拟函数InitApplication(),讨论AfxWinMain()的主要目的是看这些函数是如何被调用的。
AfxWinMain()的代码如下:
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
ASSERT(hPrevInstance == NULL); file://在win下,hPrevInstance始终为NULL
int nReturnCode = -1;
CWinThread* pThread = AfxGetThread();
CWinApp* pApp = AfxGetApp();
// AFX internal initialization
if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
goto InitFailure;
// App global initializations (rare)
if (pApp != NULL && !pApp->InitApplication())
goto InitFailure;
// Perform specific initializations
if (!pThread->InitInstance())
{
if (pThread->m_pMainWnd != NULL)
{
TRACE0("Warning: Destroying non-NULL m_pMainWnd\n");
pThread->m_pMainWnd->DestroyWindow();
}
nReturnCode = pThread->ExitInstance();
goto InitFailure;
}
nReturnCode = pThread->Run();
InitFailure:
AfxWinTerm();
return nReturnCode;
}
在上面的代码中,AfxGetThread()返回的metabase 源码是当前界面线程对象的指针,AfxGetApp()返回的是应用程序对象的指针,如果该应用程序(或进程)只有一个界面线程在运行,那么这两者返回的都是一个全局的应用程序对象指针,这个全局的应用程序对象就是MFC应用框架所默认的theApp对象(每次使用AppWizard生成一个SDI或MDI应用程序时,AppWizard都会添加CYourApp theApp这条语句,AfxGetApp()返回的就是这个theApp的地址)。
CWinApp::InitApplication(), CWinThread::InitInstance(), CWinThread::ExitInstance()是如何被调用的,从上面的代码一看就知,我不再赘述。下面我们把焦点放在CWinThread::Run()上。
MFC的控制中心――CWinThread::Run()
说CWinThread::Run()是MFC的控制中心,一点也没有夸大。在MFC中,所有来自于消息队列的消息的分派都是在CWinThread::Run()函数中完成的,同AfxWinMain()一样,这个函数也是对程序员是不可见的,其道理同AfxWinMain()的一样。
首先要提的一点是,对每条从消息队列取出来的消息,MFC根据消息的类型,按照某个特定的模式进行分发处理,这个分发模式是MFC自己定义的。固定的消息分发流程和在这个流程中的可动态改变其行为的虚拟函数就构成了MFC的消息分发模式。应用程序可以通过重载这些虚拟函数,来局部定制自己的的消息分发模式。正是通过这些虚拟函数,MFC为应用程序提供了足够的灵活性。下面讨论的所有代码都来自于MFC源代码中的threadcore.cpp文件,它们都是CWinThread的成员。
CWinThread::Run()的结构
CWinThread::Run()的代码如下:
int CWinThread::Run()
{
ASSERT_VALID(this);
// for tracking the idle time state
BOOL bIdle = TRUE;
LONG lIdleCount = 0;
// acquire and dispatch messages until a WM_QUIT message is received.
for (;;)
{
// phase1: check to see if we can do idle work
while (bIdle &&
!::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE))
{
// call OnIdle while in bIdle state
if (!OnIdle(lIdleCount++))
bIdle = FALSE; // assume "no idle" state
}
// phase2: pump messages while available
do{
// pump message, but quit on WM_QUIT
if (!PumpMessage()) return ExitInstance();
// reset "no idle" state after pumping "normal" message
if (IsIdleMessage(&m_msgCur))
{
bIdle = TRUE;
lIdleCount = 0;
}
} while (::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE));
}
ASSERT(FALSE); // not reachable
}
CWinThread::Run()的处理过程如下:
先根据空闲标志以及消息队列是否为空这两个条件判断当前线程是否处于空闲状态(这个“空闲”的含义同操作系统的含义不同,是MFC自己所谓的“空闲”),如果是,就调用CWinThread::OnIdle(),这也是源码门禁我们比较熟悉的一个虚拟函数。
如果不是,从消息队列中取出消息,进行处理,直到消息队列为空。
在这里,我们发现,MFC不是调用GetMessage()从线程消息队列中取消息,而是调用PeekMessage()。其原因在于,GetMessage()是一个具有同步行为的函数,如果消息队列中没有消息,GetMessage()会一直阻塞,使得线程处于睡眠状态,直到消息队列中有一条或多条消息,操作系统才会唤醒该线程,GetMessage()才会返回,如果线程处于睡眠状态了,就不会使线程具有MFC所谓的“空闲”状态了;而PeekMessage()则是一个具有异步行为的函数,如果消息队列中没有消息,它马上返回0,不会导致线程处于睡眠状态。
在上面的代码中,有两个函数值得探讨,一个是空闲处理函数OnIdle(),另外一个是消息分发处理函数PumpMessage()。不要忽视CWinThread的OnIdle()函数,它作了很多有意义的事情。下面讨论PumpMessage(),OnIdle()将在后面的章节里讨论。
CWinThread::Run()的核心――CWinThread::PumpMessage()
标题强调了PumpMessage()的重要性,Run()是MFC的控制中心,而PumpMessage()又是Run()的核心,所以从MFC的真正控制中心是PumpMessage()。PumpMessage()的pbl源码代码极其简单:
BOOL CWinThread::PumpMessage()
{
ASSERT_VALID(this);
if (!::GetMessage(&m_msgCur, NULL, NULL, NULL))
return FALSE;
// process this message
if (m_msgCur.message != WM_KICKIDLE && !PreTranslateMessage(&m_msgCur))
{
::TranslateMessage(&m_msgCur);
::DispatchMessage(&m_msgCur);
}
return TRUE;
}
首先,PumpMessage()调用GetMessage()从消息队列中取一条消息,由于PumpMessage()是在消息队列中有消息的时候才被调用的,所以GetMessage()会马上返回,根据其返回值,判断当前取出的消息是不是WM_QUIT消息(这个消息一般对是通过调用PostQuitMessage()放入线程消息队列的),如果是,就返回FALSE,CWinThread::Run()该退出了,CWinThread::Run()直接调用CWinThread::ExitInstance()退出应用程序。在GetMessage()的后面是我们所熟悉的TranslateMessage()和DispatchMessage()函数。
可以看出,是否调用TranslateMessage()和DispatchMessage()是由一个名称为PreTranslateMessage()函数的返回值决定的,如果该函数返回TRUE,则不会把该消息分发给窗口函数处理。
就我个人观点而言,正是有了这个PreTranslateMessage(),才使得MFC能够灵活的控制消息的分发模式,可以说,PreTranslateMessage()就是MFC的消息分发模式。
<三>MFC的特色――PreTranslateMessage()
经过层层扒皮,终于找到了CWinThread::Run()最具特色的地方,这就是PreTranslateMessage()函数。同前面使用SDK编写的显示”Hello, world!”程序的消息循环不同的地方在于,MFC多了这个PreTranslateMessage(),PreTranslateMessage()最先获得了应用程序的消息处理权!下面我们对PreTranslateMessage()进行剥皮式分析。同前面一样,首先看看实际的PreTranslateMessage()的代码:
BOOL CWinThread::PreTranslateMessage(MSG* pMsg)
{
ASSERT_VALID(this);
// if this is a thread-message, short-circuit this function
if (pMsg->hwnd == NULL && DispatchThreadMessageEx(pMsg)) return TRUE;
// walk from target to main window
CWnd* pMainWnd = AfxGetMainWnd();
if (CWnd::WalkPreTranslateTree(pMainWnd->GetSafeHwnd(), pMsg)) return TRUE;
// in case of modeless dialogs, last chance route through main
// window's accelerator table
if (pMainWnd != NULL)
{
CWnd* pWnd = CWnd::FromHandle(pMsg->hwnd);
if (pWnd->GetTopLevelParent() != pMainWnd)
return pMainWnd->PreTranslateMessage(pMsg);
}
return FALSE; // no special processing
}
PreTranslateMessage()的处理过程如下:
首先判断该消息是否是一个线程消息(消息的窗口句柄为空的消息),如果是,交给DispatchThreadMessageEx()处理。我们暂时不管DispatchThreadMessageEx(),它不是我们讨论的重点。
调用CWnd::WalkPreTranslateTree()对该消息进行处理,注意该函数的robots源码一个参数是线程主窗口的句柄,这是PreTranslateMessage()的核心代码,在后面会对这个函数进行详细的分析。
对于非模式对话框,这特别的、额外的处理。
下面详细讨论一下CWnd::WalkPreTranslateTree()函数,它的代码很简单:
BOOL PASCAL CWnd::WalkPreTranslateTree(HWND hWndStop, MSG* pMsg)
{
ASSERT(hWndStop == NULL || ::IsWindow(hWndStop));
ASSERT(pMsg != NULL);
// walk from the target window up to the hWndStop window checking
// if any window wants to translate this message
for (HWND hWnd = pMsg->hwnd; hWnd != NULL; hWnd = ::GetParent(hWnd))
{
CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
if (pWnd != NULL)
{
// target window is a C++ window
if (pWnd->PreTranslateMessage(pMsg))
return TRUE; // trapped by target window (eg: accelerators)
}
// got to hWndStop window without interest
if (hWnd == hWndStop)
break;
}
return FALSE; // no special processing
}
CWnd::WalkPreTranslateTree()的所使用的策略很简单,拥有该消息的窗口最先获得该消息的处理权,如果它不想对该消息进行处理(该窗口对象的PreTranslateMessage()函数返回FALSE),就将处理权交给它的父亲窗口,如此向树的根部遍历,直到遇到hWndStop(在CWinThread::PreTranslateMessage()中,hWndStop表示的是线程主窗口的句柄)。记住这个消息处理权的传递方向,是由树的某个一般节点或叶子节点向树的根部传递!
小结:
下面对这一章作一个小结。
MFC消息控制流最具特色的地方是CWnd类的虚拟函数PreTranslateMessage(),通过重载这个函数,我们可以改变MFC的消息控制流程,甚至可以作一个全新的控制流出来,在下面的一章会对MFC的实现作详细介绍。
只有穿过消息队列的消息才受PreTranslateMessage()影响,采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息根本不会理睬PreTranslateMessage()的存在
传给PreTranslateMessage()的消息是未经翻译过的消息,它没有经过TranslateMessage()处理,在某些情况下,要仔细处理,以免漏掉消息。
QQ返利机器人是骗局吗?
的确是骗局 第一招:(直接卖终生版)
强制与诱导用户购买终生版.做一锤子买卖.
软件的费用收到后.再有问题或者不好用了.你的钱再也退不回来了.
第二招.(源码版)
卖家直接卖源码版.主要强调源码版的好处.可以再次倒卖.
殊不知这种软件买源码版是没用的.因为联盟会经常更新.QQ也会有更新.源码到我手里就算当时能用.一旦有更新在你手上就万了一文不值的字符了.
第三招:(价格低叫你直接打款)
这种骗术很低级.现在淘宝交易多安全呢.直接打款那不是送钱给人家么.打款了你认为人家会再理你吗?
第四招:(拉人头炒作)
这个不用多说了.有些软件炒作得很厉害.到处可以找得到他们的炒作.
给大家不上当的意见.
不支持试用的返利机器人不要考虑.
不支持月付的也不要考虑.
售后更新不及时的不要考虑.
没得运营指导的不要考虑.
交易不安全的不要考虑.
邵阳麻将、邵阳剥皮游戏定制需要多少钱?
邵阳麻将与邵阳剥皮游戏的定制费用问题,主要取决于开发公司对技术需求的实现与优化。湖南地区市场虽大,但正规开发公司不多,且这类棋牌游戏软件技术含量高,需要不断测试与修改以达到最优化,因此成本与时间投入相对较大。预算通常在4-8w左右,具体费用需与公司协商。
湖南怀化的大游网络科技公司,作为本地开发企业,对当地风俗与特点有深入理解,能更完美地进行游戏开发。他们提供上千款游戏成品体验,并提供一对一服务,量身定制专属的棋牌游戏,源码交付,确保安全可靠。
邵阳麻将与邵阳剥皮游戏的定制价格,除了与技术复杂度相关,还取决于与开发公司的具体谈判结果。大游网络科技这类本地企业,以其对本地文化的深刻理解,以及专业的开发与服务,是定制这两款游戏的理想选择。
暴殄天物怎么造句
1、每餐都剩那麼多,为何不少煮些?这种暴殄天物的情景,令人心痛。
2、这些要被丢弃的家具都还很新,为免暴殄天物,让我们整理一下,转送给需要的人吧!
3、圆明园的稀世珍宝就这样被英法联军糟蹋了,真是暴殄天物!
4、看到歹徒们暴殄天物的行径,许多人都厉声谴责,还有人打电话给“”,要求对其绳之以法。
5、现在,人类暴殄天物,暴戾恣睢使得大量的野生物逐渐消亡。
6、吃馒头还要剥皮,这真是暴殄天物!
7、每餐都剩那麽多,为何不少煮些?这种暴殄天物的情景,令人心痛。
8、这样浆酒霍肉,简直是暴殄天物。
9、许多值钱的东西,任人作践了,也似乎暴殄天物。
、敌人把大量食品倒入河内,简直是在暴殄天物。
、这样的天气不出去走走,简直就是在暴殄天物!
、每餐都剩那么多,为何不少煮些?这种暴殄天物的情景,令人心痛。
、有些人乱砍乱伐,树木大量减少,这真是暴殄天物。
、既有许多值钱有东西,任人作践了,也似乎暴殄天物。
、这是一次暴殄天物的活动。
、你这种浪费的行为,真是暴殄天物。
、这么好的木料竟然拿来当柴火烧,真是暴殄天物!
、你拒绝参与社交活动,简直是暴殄天物,还有可能惹恼自己的老板,这是一种愚蠢的做法。
、奶奶告诫我们,不可让碗中剩有饭粒,否则暴殄天物,会遭天打雷劈。
、这麼好的木料竟然拿来当柴火烧,真是暴殄天物!
、一粥一饭当思来之不易,不能浪费,暴殄天物。
、近年来社会风气败坏,许多人养成暴殄天物的恶习,值得警惕。
、那不是食人族暴殄天物!
、物力唯艰,大家要珍惜资源,切忌暴殄天物。
、老师告诉我们:"要知盘中飧,粒粒皆辛苦,假如暴殄天物,小心将来没饭吃。"。
、那些学生,每餐饭菜都吃不完倒掉,真是暴殄天物!
、因此,一种咖啡豆应被烘培成浅棕色以释放其特有的香味,而如果另一种咖啡豆也如法炮制,则也许就是暴殄天物。
、他有一个聪明的大脑,一副俊朗的身材,一个好的家庭,但却整天不学无术,真是暴殄天物。
、许多老师看见学生把饭菜洒得满桌都是,大发感慨:“这真是暴殄天物啊!”。
、至少也要三天两夜,勉强将整个重点走完。一天走完,是暴殄天物。
、这麽好的木料竟然拿来当柴火烧,真是暴殄天物!
、吃馒头还要剥皮儿,这不是暴殄天物吗!
、美女是上帝对人类的恩赐,有什么理由不去欣赏她们?不去虔诚地接纳她们?对美女的熟视无睹,实在是暴殄天物,更是对上天的最大不敬。烽火戏诸侯
、尤其是最后一点最为重要,一个难于扩展的框架在Linux这样一个开放源代码的空间里,无疑是暴殄天物。
、衣服烤好了,蛋炒饭也端了上来,就着辣椒蒜瓣细嚼慢咽,生怕暴殄天物。
、这个世界,向来就是弱肉强食,强大的武技都是强者的心血,难道还要让那些平庸之辈,私藏一辈子?这不是暴殄天物吗?
、不暴殄天物,不重裘,不兼味,不妄毁伤,不厚于自奉,皆修德之渐,为人所当谨。
、就算是现在不急着找鞑子报仇,也不用白送东西给他们啊,那个时钟可是赤心赤诚两师弟的心血,送给这些鞑子,真是明珠投暗暴殄天物。
、哼,土鸡就算穿上了金缕衣,她也变不了凤凰,这么好看的连衣裙却穿在一个乡下村姑身上,真是暴殄天物。
、天啦,简直是穷奢极侈、暴殄天物!
、假如真是遭遇了什么不测的话,那真是一件暴殄天物,让人扼腕兴嗟的憾事。
、好!好东西,这么好的东西放在你手中真是遗珠掩尘,暴殄天物。
、含笑初识云雨,本就迷恋甚深,此时听冰魄仙子言语,心中胆气豪盛,于是说道:仙儿说得对,有如此尤物在手,不尝且不是暴殄天物。
、如果眼睁睁地看着它们死去或者对它们的生死不管不问,则无异于是暴殄天物,煮鹤焚琴,他一定会强烈地谴责自己,而他的良心也一定会长久地得不到安宁。
、莫小鸢说三颗玉清丹就能让他晋升炼气境三层,肯定不是无的放失,放着这么好的东西不用,岂不是暴殄天物了啊,南阳夹起玉清丹,准备放到口中。
、用钱去花天酒地?那无疑是一个丰满美女下嫁给一个性功能障碍的糟老头,暴殄天物。
、所以,修真界中却是从来没有出现过那种暴殄天物,买椟还珠的事情。
、极物寺能拥有它,也是一种荣幸,只可惜没有更多高僧大德勇于放下手边的琐屑俗事,转而穷经皓首地研究它,以至于暴殄天物……
、更有可笑的如司马长风得了大量的灵石,却也不知如何妙用,竟拿来修筑室内墙体,真是暴殄天物。