LOFTER for ipad —— 让兴趣,更有趣

点击下载 关闭

LOFTER-网易轻博

映射

354浏览    66参与
美廊

人@系统——人体映射

作者:美廊
意识端的参考系,可以一图一表,这一个具有镜像,地图,视窗多功能工具实现。 人体端的参考系,可以包含中医的炁系统,西医的解剖学,乃至AI引用的相关学科。 二者之间的人@系统,已经做了一些链接,尤其……

这一篇,要为人@系统,见现于人体,做好准备。

人体,是一个最精妙的人@系统,尤其是脑的部分,非常精微。

不论是对人工智能(AI)来说,还是对于医疗健康而言,了解人体都是必需的。

尤其,对于中医来说,因为解剖学的发展,需要一个精细化的过程。

Unkuly
对比 ————映射之美 尼康D...

对比


————映射之美


尼康D5600

对比


————映射之美



尼康D5600

Sven

复习集合和映射

QAQ好忧桑要考试了

映射:啊既然说函数是特殊的映射,那就可以从函数来推映射的性质啊w一个x对应一个y但是一个y值可以有n和x(y=sinx)
→a的像是唯一的,a’的原项不一定是唯一的(M’中的元素不一定有原像)

映射的乘积:就近原则

不满足交换律(可用复合函数为例)

满射:每一个a’都有原像和它对应
单射:不同元素像不同
双射:即是单射又是满射~~

有限集上存在双射的充分必要条件是元素个数相同
(无限集未必如此 整数n→2n)

σ可逆充要:双射

如果στ分别是M到M’,M’到M”的双射,那么乘积τσ就是M到M”的双射。

QAQ好忧桑要考试了

映射:啊既然说函数是特殊的映射,那就可以从函数来推映射的性质啊w一个x对应一个y但是一个y值可以有n和x(y=sinx)
→a的像是唯一的,a’的原项不一定是唯一的(M’中的元素不一定有原像)

映射的乘积:就近原则

不满足交换律(可用复合函数为例)

满射:每一个a’都有原像和它对应
单射:不同元素像不同
双射:即是单射又是满射~~

有限集上存在双射的充分必要条件是元素个数相同
(无限集未必如此 整数n→2n)

σ可逆充要:双射

如果στ分别是M到M’,M’到M”的双射,那么乘积τσ就是M到M”的双射。

compbio94

Pandas(data analysis)

作者:compbio94
powerful Python data analysis toolkit,pandas是一种实用的数据处理工具,提供大量的数据结构和函数处理数据。

我想找一份数据处理的实习,之前在中科院植物园做过一份类似的工作,但是由于当时没有学好,导致我大部分是使用Excel完成的,pandas提供三种数据结构,广播机制,对齐功能,唯一化功能为数据处理提供了大量的函数。

熊猫酱

小白点香2:欧珑 北风广藿、BY FUKAMIZU 铃兰雪、Ormonde jayne空幽之气、Amouage 爱慕 映射EDP、阿蒂仙 阿蒂仙之水
http://mp.weixin.qq.com/s/u3rL9-op2bLRj8n3Bo76cA

小白点香2:欧珑 北风广藿、BY FUKAMIZU 铃兰雪、Ormonde jayne空幽之气、Amouage 爱慕 映射EDP、阿蒂仙 阿蒂仙之水
http://mp.weixin.qq.com/s/u3rL9-op2bLRj8n3Bo76cA

你好-世界

天仙配

作者/王二屎

我问工头,为何工地没看到食堂和宿舍?工头说没有食堂,看到那边那栋高层没?最高的那一栋,宿舍就在那边。我抬头往宿舍方向眺望,没敢想我能住那么高。

宿舍在坡子街,从工地到宿舍,要横跨这个城市最繁华的地段:五一大道与解放西路,中间要经过太平街或下河街。我拖着行头,跟在识途老乡身后,低头穿过人群拥挤的五一路,过太平街时,老乡吐掉槟榔渣,说以后上下班就走这儿啦!平平安安,不要走下河街。我说我们做室内,不怕失足。我怕在这碰见熟人,网友,前同事,前女友,前前女友以及她们朋友们。我要穿着沾满水泥沙浆的迷彩工作服,每天早中晚在这片多事多非的地方穿行,一旦与拖家带狗的她她狭路相逢,意味着穿帮和尴...

作者/王二屎

我问工头,为何工地没看到食堂和宿舍?工头说没有食堂,看到那边那栋高层没?最高的那一栋,宿舍就在那边。我抬头往宿舍方向眺望,没敢想我能住那么高。

宿舍在坡子街,从工地到宿舍,要横跨这个城市最繁华的地段:五一大道与解放西路,中间要经过太平街或下河街。我拖着行头,跟在识途老乡身后,低头穿过人群拥挤的五一路,过太平街时,老乡吐掉槟榔渣,说以后上下班就走这儿啦!平平安安,不要走下河街。我说我们做室内,不怕失足。我怕在这碰见熟人,网友,前同事,前女友,前前女友以及她们朋友们。我要穿着沾满水泥沙浆的迷彩工作服,每天早中晚在这片多事多非的地方穿行,一旦与拖家带狗的她她狭路相逢,意味着穿帮和尴尬!

宿舍在六楼,是一个小隔间,还住着另一个老乡,隔壁的大间则住着几十号人,有邵阳人,湖北人,广东人益阳人和宁乡人。几天后,我惊悚地发现那边还住着个漂亮女人!我立即想要加入他们,遭到拒绝,理由是:我们不是一个班组,住一个宿舍容易搞乱。我对老乡说,人家歧视我们呢!但老乡说不可能,说在工地,不管他是哪里人,都要怕我们新化人,我说那不就是歧视嘛!老乡说我太自卑。

你能在长沙任意一个工地上见到新化人,你也能在西站,南站,马王堆高桥撞到混的他们,和睡到站的她们。

我们随地吐痰随地小便,我们用旧报纸擦屁股,用手掌揩鼻涕,偷看女人洗澡,把钢筋绑腿上带出工地换酒喝。我们的个人卫生让人着急,我们的心理卫生令人生忧,我们用四肢来做事和思考,我们不是二等公民,我们比二还要低几等,我们不仅仅是新化人,我们是攸县人,南县人,张家界人,邵东人,双峰人,安化人,涟源人,冷水江人,我们是农民工。本地人讨厌我们,我们自己则相互讨厌,我们都有着相同且多的弱点和缺陷。但我能说我们的缺陷是社会的缺陷,我们的弱点是人性的弱点么!只是有人在这个点上开花,有人看到有花就把它摘了。

邻居拒绝我们的加入,我们没有乱来,而他们那边一直不太平静,牌桌上吵,饭桌上吵,床上床下厕所澡堂都可以见到他们的争吵。比较刺激的一次是:某个痴汉半夜在月光下孤独地吃隔壁漂亮女人晾在过道的内裤,我无法代入女人的老公起床夜尿,出门看到如此景观是何心情。痴汉被揍得哭爹喊娘,末了还被逼下跪道歉赔钱,差点引起宿舍两股人火拼。

这以前,我一直以为,内裤賊是一个高刺激低风险的事业,我信息给一个之前的工友,劝告那位安化老几以后务必好好做人。

在前一个工地,我们可以选择睡工棚或工地,我和他在工地的三楼分铺睡一个屋。这个老几定力不行,没一次能坚持看完一个毛片,通常看到一半就开溜,临走时留遗言一句“受不了了,我去楼顶放一枪。”不出意外,第二天必有女人内裤失窃,也偶尔几次听到有男人骂娘,心痛内裤昨夜无风而逝,合算着今天又有几个平方的灰白抹了,多少面积的砖白贴了。

当时已是零晨三点,工友竟然没睡,回信问我在哪?我说下河街,他骂我没嬲过别,说那种地方你也去,没意思,没情趣,你从街头走到街尾,所有货色都是一句搞不搞,连句老板都不会叫,上的时候更来气,上死人似的,你让她叫两句,她就哎呦呦哎呦呦呦,活像群娃娃鱼在叫,我说那明明是个叫床版的《忐忑》。工友操了我一句——还TM左小祖咒版的呢!

早上八点,包头电话过来,问我们怎么还没到工地,我说我们今天需要休息,不做事,这个益阳老几冲我吼,说一个月内没给他完工就别想拿钱,我开的外音,我们中间年龄最大的老乡闻声跳起,接过电话开始嬲他娘,另一老乡也凑过来,说黑工地都没人敢赖他一块钱,说不干了,叫他马上过来给大伙结帐,敢拖欠一毛钱就要揍得他流屎,我见两位老乡都很激动,抢回电话大声补充,告诉他不要以为挨饱了揍就可以赖掉工钱,没这个好事!

这个喜欢拿工钱来压人的包工头,最终被一伙涟源人抽得脸蛋肿成馒头,原因无他。在工地,人们对未拿到手的工钱总是透着股危机感,容易躁动。

当时老乡看不下去,要去劝架,我说还没出屎呢,看戏看戏,你看他那一身肉,好像好好打的样子。

这个傻瓜,他以为抓住了民工的鼻子,但那也是底线和痛!

我曾看到一个女人因为拿不到工钱从五楼跳下当场摔死,她的丈夫当时就在楼下,站在围观的人群中像块烂木头般不声不吭,木然望着楼顶绝望的女人。我也见过一个月上六十四天班的神仙大姐(当时的情况是白天做满十小时为一天工。晚上加班则是,上半夜加班一小时算一点五,下半夜一小时算两分)。

前年冬天,我们宿舍有一对兄弟,这对兄弟家境不好,在工地做小工,清洗外墙的瓷砖。哥哥小时得过脑膜炎,有点呆傻,弟弟二十好几了听说还没谈过女朋友,他们俩人两天的工钱加一起还没我一天的多。一次烤火夜谈,聊到工地前些天摔死的一个电梯工的赔偿款,有人就说:某傻,你这么活着,总有一天你弟要被你拖死的,你还不如去死了干净。哪天你从脚手架上往下一跳,自己解脱了不说,你弟也能得一笔钱成个家。

对这种半调侃的诛心玩笑,哥哥呵呵呵呵傻笑,而当时只是沉默的弟弟,在烤完火后回房睡觉,再抱着哥哥的臭脚取暖时,会不会做噩梦呢?

工程顺利完工,在等待验收,结帐然后拿钱走人的日子里,再没有什么事情是必须要做的。第一天,我们除了拉撒,吃喝都在床上。

傍晚醒来,老乡在电话联系下个工地,我短信给一个女人,说我想她,没有回音。去楼下小卖部买包槟榔,问老板有没有我的信,老板说如果收到会通知我。我回宿舍把槟榔丢给老乡,准备喝壶酒继续睡觉。

夜晚来临,我还没有睡去,老乡们出去吃饭,我决定去走一走下河街。夜幕下,我脚步虚浮,踩着湿漉漉的石板,在下河街走了两个来回,没见到工友所说,两旁数十失足夹道喊“搞”的场景! 从下河街出来,江风冷烈,橘子洲头的烟火在头顶咆哮,我头痛欲裂,又走了一些时候,酒劲似乎还在往上涌,我有些分不清方向,不过没有关系,我今晚可以去我想去的任何地方,我现在就要找个干净的地方睡一觉。

那里,厕所的水不会半夜往我床下流,浸湿我的鞋,没人在我酣睡时把电视机摔到地上,没有凌晨三四点钟压抑的啪啪啪,吱吱吱,地上没有浓痰没有剩饭没有老鼠屎,我可以把后背安全地交给墙壁而不用担心被鼻涕粘住!那里没有脚臭,没有鼾声磨牙声梦呓声没有二手烟。但是,一旦没了这一切会怎样呢?有一万种可能。只是对我来说,任何一种都不会比现在更好。

尽管我憎恶工地的一切,但它如此简单直接,以至于我只需要一双手和一点蛮力就能在这儿生存,它如此适合我。

只是,今夜我不会回来,酒醒了也不回来,明天我也不一定会回来,等钱花光我就回来。


国君

【感悟】时间、不是实相、但映射出了实相

【感悟】时间、不是实相、但映射出了实相。我们渴望拥有,它说有聚则会有散;我们渴望年轻,它画了一道道年轮在人们脸上;我们渴望恒常的美丽,并把信心交给“未来”,未来说:除了一个个当下、我何尝存在,当下无常,我亦如是无常!


【感悟】时间、不是实相、但映射出了实相。我们渴望拥有,它说有聚则会有散;我们渴望年轻,它画了一道道年轮在人们脸上;我们渴望恒常的美丽,并把信心交给“未来”,未来说:除了一个个当下、我何尝存在,当下无常,我亦如是无常!



The Nine

System IPC 与Posix IPC(共享内存)

系统v(共享内存)


1.对于系统V共享内存,主要有以下几个API:shmget()、shmat()、shmdt()及shmctl()。


2.shmget()用来获得共享内存区域的ID,如果不存在指定的共享区域就创建相应的区域。

shmat()把共享内存区域映射到调用进程的地址空间 中去,这样,进程就可以方便地对共享区域进行访问操作。

shmdt()调用用来解除进程对共享内存区域的映射。

shmctl实现对共享内存区域的控制操 作。

这里我们不对这些系统调用作具体的介绍,读者可参考相应的手册页面,后面的范例中将给出它们的调用方法。

系统v(共享内存)

 

1.对于系统V共享内存,主要有以下几个API:shmget()、shmat()、shmdt()及shmctl()。

 

2.shmget()用来获得共享内存区域的ID,如果不存在指定的共享区域就创建相应的区域。

shmat()把共享内存区域映射到调用进程的地址空间 中去,这样,进程就可以方便地对共享区域进行访问操作。

shmdt()调用用来解除进程对共享内存区域的映射。

shmctl实现对共享内存区域的控制操 作。

这里我们不对这些系统调用作具体的介绍,读者可参考相应的手册页面,后面的范例中将给出它们的调用方法。

注:shmget的内部实现包含了许多重要的系统V共享内存机制;shmat在把共享内存区域映射到进程空间时,并不真正改变进程的页 表。当进程第一次访问内存映射区域访问时,会因为没有物理页表的分配而导致一个缺页异常,然后内核再根据相应的存储管理机制为共享内存映射区域分配相应的 页表。

3、系统V共享内存限制

在/proc/sys/kernel/目录下,记录着系统V共享内存的一下限制,如一个共享内存区的最大字节数shmmax,系统范围内最大共享内存区标识符数shmmni等,可以手工对其调整,但不推荐这样做。

#include <sys/ipc.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>

#include <string.h>
typedef struct {
    char name[4];
    int age;
}people;


int main(int argc,char *argv[]){

    int shm_id ,i;
    key_t key;
    char temp;
    people *p_map;
    char* name = "./myshm";
    key = ftok(name,0);
    if(key==-1){
        perror("ftok error!");
    }
    shm_id = shmget(key,4096,IPC_CREAT);
    if(shm_id ==-1){
        perror("shmget error");
    }
    p_map = (people*)shmat(shm_id,NULL,0);
    temp = 'a';
    for(i = 0;i<10;i++)
    {
        temp +=1;
        memcpy((*(p_map +i )).name,&temp, 1);
        (*(p_map + i)).age = 20+i;
    }
    
    if(shmdt(p_map)==-1)
        perror("detach error");
}

 

 

#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

typedef struct {
    char name[4];
    int  age;
}people;
int main(int argc,char *argv[]){
    int shm_id ,i;
    key_t key;
    char temp;
    people *p_map;
    char* name = "./myshm";
    key = ftok(name,0);
    if(key==-1){
        perror("ftok error!");
    }
    shm_id = shmget(key,4096,IPC_CREAT);
    if(shm_id ==-1){
        perror("shmget error");
    }
    p_map = (people*) shmat(shm_id,NULL,0);
    for(i = 0;i<10;i++){
        printf("Name: %s,Age: %d\n",(*(p_map+i)).name,(*(p_map+i)).age);
    }
    if(shmdt(p_map)==-1)
    {
        perror("detach error");
    }
}

 

 

The Nine

实现 Win32 程序的消息映射宏(类似 MFC )

对于消息映射宏,不用多说了,用过 MFC 的人都很清楚。但目前有不少程序由于各种原因并没有使用 MFC,所以本帖讨论一下如何在 Win32 程序中实现类似MFC的消息映射宏。其实 Windows 的头文件 “WindowsX.h”(注意:不是“Windows.h”) 中提供了一些有用的宏来帮助我们实现消息映射。本座是也基于这个头文件实现消息映射,首先看看宏定义文件:


#pragma once

#include <windowsx.h>

/********************************************************...

对于消息映射宏,不用多说了,用过 MFC 的人都很清楚。但目前有不少程序由于各种原因并没有使用 MFC,所以本帖讨论一下如何在 Win32 程序中实现类似MFC的消息映射宏。其实 Windows 的头文件 “WindowsX.h”(注意:不是“Windows.h”) 中提供了一些有用的宏来帮助我们实现消息映射。本座是也基于这个头文件实现消息映射,首先看看宏定义文件:

 

#pragma once

#include <windowsx.h>

/************************************************************************/
/*                               消息映射帮助宏                             */
/************************************************************************/

/* see: WindowsX.h */
#define HANDLE_SYS_MSG(hwnd, message, fn)    HANDLE_MSG(hwnd, message, fn)

/* LRESULT Cls_OnMessage(HWND hwnd, WPARAM wParam, LPARAM lParam) */
#define HANDLE_USER_MSG(hwnd, message, fn)                                \
case (message): return (LRESULT)(fn)((hwnd), (wParam), (lParam))

#define FORWARD_USER_MSG(hwnd, message, wParam, lParam, fn)                \
(LRESULT)(fn)((hwnd), (message), (wParam), (lParam))

#define GET_WND_PROC_INTERNAL(theClass, flag)    ((WNDPROC)theClass##flag##WndProc)
#define GET_DLG_PROC_INTERNAL(theClass, flag)    ((DLGPROC)theClass##flag##DlgProc)

#define DECLARE_MSG_MAP_INTERNAL(theClass, flag)        \
static LRESULT CALLBACK theClass##flag##WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

#define DECLARE_DLG_MSG_MAP_INTERNAL(theClass, flag)    \
static BOOL CALLBACK theClass##flag##DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

#define BEGIN_MSG_MAP_INTERNAL(theClass, flag)            \
LRESULT theClass##flag##WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)    \
{                                                                                    \
LRESULT result = 0;                                                                \
\
switch(msg)                                                                        \
{

#define BEGIN_DLG_MSG_MAP_INTERNAL(theClass, flag)        \
BOOL theClass##flag##DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)        \
{                                                                                    \
BOOL    retVal = TRUE;                                                            \
LRESULT result = 0;                                                                \
\
switch(msg)                                                                        \
{

// 窗口过程为类中的静态成员函数
#define GET_WND_PROC(theClass)            GET_WND_PROC_INTERNAL(theClass, ::)
#define GET_DLG_PROC(theClass)            GET_DLG_PROC_INTERNAL(theClass, ::)

#define DECLARE_MSG_MAP(theClass)                    \
public:                                                \
DECLARE_MSG_MAP_INTERNAL(theClass, ::)

#define DECLARE_DLG_MSG_MAP(theClass)                \
public:                                                \
DECLARE_DLG_MSG_MAP_INTERNAL(theClass, ::)

#define BEGIN_MSG_MAP(theClass)            BEGIN_MSG_MAP_INTERNAL(theClass, ::)
#define BEGIN_DLG_MSG_MAP(theClass)        BEGIN_DLG_MSG_MAP_INTERNAL(theClass, ::)

/* 消息处理函数的声明请参考: <WindowsX.h> 的 HANDLE_MSG */
#define ADD_MSG_MAP(msg, fn)                        \
case (msg): result = HANDLE_##msg((hWnd), (wParam), (lParam), (fn));    break;

/* LRESULT Cls_OnMessage(HWND hwnd, WPARAM wParam, LPARAM lParam) */
#define ADD_USER_MSG_MAP(msg, fn)                    \
case (msg): result = (LRESULT)(fn)((hWnd), (wParam), (lParam));            break;

#define END_MSG_MAP()                                \
default:                                    \
result = ::DefWindowProc(hWnd, msg, wParam, lParam);                        \
}                                                                                \
\
return result;                                                                    \
}

#define END_DLG_MSG_MAP()                            \
default:                                    \
retVal = FALSE;                                                                \
}                                                                                \
\
if(retVal)                                                                        \
SetDlgMsgResult(hWnd, msg, result);                                            \
\
return retVal;                                                                    \
}

// 窗口过程为全局函数
#define GET_GLOBAL_WND_PROC(theClass)            GET_WND_PROC_INTERNAL(theClass,            _)
#define DECLARE_GLOBAL_MSG_MAP(theClass)        DECLARE_MSG_MAP_INTERNAL(theClass,        _)
#define BEGIN_GLOBAL_MSG_MAP(theClass)            BEGIN_MSG_MAP_INTERNAL(theClass,        _)
#define END_GLOBAL_MSG_MAP()                    END_MSG_MAP()

#define GET_GLOBAL_DLG_PROC(theClass)            GET_DLG_PROC_INTERNAL(theClass,            _)
#define DECLARE_GLOBAL_DLG_MSG_MAP(theClass)    DECLARE_DLG_MSG_MAP_INTERNAL(theClass,    _)
#define BEGIN_GLOBAL_DLG_MSG_MAP(theClass)        BEGIN_DLG_MSG_MAP_INTERNAL(theClass,    _)
#define END_GLOBAL_DLG_MSG_MAP()                END_DLG_MSG_MAP()

// 绑定对象指针到窗口
#define ATTACH_OBJ_PTR_TO_WINDOW(hwnd, objPtr)    ::SetWindowLong(hwnd, GWL_USERDATA, (LONG_PTR)objPtr)
#define GET_OBJ_PTR_FROM_WINDOW(hwnd, theClass)    (theClass*)(LONG_PTR)::GetWindowLong(hwnd, GWL_USERDATA)

#define DEFINE_OBJ_PTR_FROM_WINDOW(hwnd, theClass, pObj)                        \
theClass* pObj = (theClass*)(LONG_PTR)::GetWindowLong(hwnd, GWL_USERDATA);    \
ASSERT(pObj);

 

  先介绍一下几个重要的宏定义:

  • DECLARE_MSG_MAP(theClass):声明窗口过程函数,其中窗口过程函数实现为类的静态方法

  • DECLARE_GLOBAL_MSG_MAP(theClass):声明窗口过程函数,其中窗口过程函数实现为全局函数,因此“theClass”参数可以任意写,不一定是类名

  • DECLARE_DLG_MSG_MAP(theClass):声明对话框的窗口过程函数,其中窗口过程函数实现为类的静态方法

  • DECLARE_GLOBAL_DLG_MSG_MAP(theClass):声明对话框窗口过程函数,其中窗口过程函数实现为全局函数,因此“theClass”参数可以任意写,不一定是类名

  • BEGIN_MSG_MAP(theClass):定义窗口过程函数,其中窗口过程函数实现为类的静态方法

  • BEGIN_GLOBAL_MSG_MAP(theClass):定义窗口过程函数,其中窗口过程函数实现为全局函数,因此“theClass”参数可以任意写,不一定是类名

  • BEGIN_DLG_MSG_MAP(theClass):定义对话框的窗口过程函数,其中窗口过程函数实现为类的静态方法

  • BEGIN_GLOBAL_DLG_MSG_MAP(theClass):定义对话框窗口过程函数,其中窗口过程函数实现为全局函数,因此“theClass”参数可以任意写,不一定是类名

  • ADD_MSG_MAP(msg, fn):添加 Windows 内部消息映射

  • ADD_USER_MSG_MAP(msg, fn):添加用户自定义消息映射

  • END_MSG_MAP():结束消息映射,对应 BEGIN_MSG_MAP

  • END_GLOBAL_MSG_MAP():结束消息映射,对应 BEGIN_GLOBAL_MSG_MAP

  • END_DLG_MSG_MAP():结束消息映射,对应 BEGIN_DLG_MSG_MAP

  • END_GLOBAL_DLG_MSG_MAP():结束消息映射,对应 BEGIN_GLOBAL_DLG_MSG_MAP

  • GET_WND_PROC(theClass):获取窗口过程函数的地址,对应 DECLARE_MSG_MAP

  • GET_GLOBAL_WND_PROC(theClass):获取窗口过程函数的地址,对应 DECLARE_GLOBAL_MSG_MAP

  • GET_DLG_PROC(theClass):获取对话框窗口过程函数的地址,对应 DECLARE_DLG_MSG_MAP

  • GET_GLOBAL_DLG_PROC(theClass):获取对话框窗口过程函数的地址,对应 DECLARE_GLOBAL_DLG_MSG_MAP

  • ATTACH_OBJ_PTR_TO_WINDOW(hwnd, objPtr):把对象指针与窗口句柄进行绑定

  • GET_OBJ_PTR_FROM_WINDOW(hwnd, theClass):从窗口句柄中获取对象指针

  • DEFINE_OBJ_PTR_FROM_WINDOW(hwnd, theClass, pObj):从窗口句柄中获取对象指针,并赋值给局部变量 pObj

   这里说明一下:对话框的消息映射与普通窗口的消息映射使用不同的宏进行定义;另外,窗口过程可以实现为类的静态方法或全局函数。例如,如果要定义一个对话框的窗口过程,并实现为全局函数则使用 DECLARE_GLOBAL_DLG_MSG_MAPBEGIN_GLOBAL_DLG_MSG_MAP、END_GLOBAL_DLG_MSG_MAP  GET_GLOBAL_DLG_PROC 系列宏。

 

  下面以一个普通窗口的消息映射为例子演示如何使用这些宏:

/*** MyClass.h ***/class MyClass
{  // 其它方法  virtual void OnDraw(const paint_dc& dc);  virtual BOOL Destroy();  // 系统消息
static BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct);
staticvoid OnDestroy(HWND hwnd);
staticvoid OnPaint(HWND hWnd);
staticvoid OnClose(HWND hwnd);
staticvoid OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags);
staticvoid OnLButtonUp(HWND hwnd, int x, int y, UINT keyFlags);
staticvoid OnMouseMove(HWND hwnd, int x, int y, UINT keyFlags);
staticvoid OnActivate(HWND hwnd, UINT state, HWND hwndActDeact, BOOL fMinimized);  // 用户自定义消息
static LRESULT OnLockScreen(HWND hwnd, WPARAM wParam, LPARAM lParam);  static LRESULT OnMenuBtnDown(HWND hwnd, WPARAM wParam, LPARAM lParam);
static LRESULT OnSensorUp(HWND hwnd, WPARAM wParam, LPARAM lParam);
static LRESULT OnSensorDown(HWND hwnd, WPARAM wParam, LPARAM lParam);
static LRESULT OnSensorLeft(HWND hwnd, WPARAM wParam, LPARAM lParam);
static LRESULT OnSensorRight(HWND hwnd, WPARAM wParam, LPARAM lParam);  // 声明窗口过程
  DECLARE_MSG_MAP(MyClass)
};

/*** MyClass.cpp ***/

#include "MyClass.h"// 定义消息映射
BEGIN_MSG_MAP(MyClass)
ADD_MSG_MAP(WM_CREATE,                        OnCreate)
ADD_MSG_MAP(WM_CLOSE,                        OnClose)
ADD_MSG_MAP(WM_DESTROY,                        OnDestroy)
ADD_MSG_MAP(WM_PAINT,                        OnPaint)
ADD_MSG_MAP(WM_LBUTTONDOWN,                    OnLButtonDown)
ADD_MSG_MAP(WM_LBUTTONUP,                    OnLButtonUp)
ADD_MSG_MAP(WM_MOUSEMOVE,                    OnMouseMove)
ADD_MSG_MAP(WM_ACTIVATE,                    OnActivate)
ADD_USER_MSG_MAP(MSG_MENU_BTN_DOWN,            OnMenuBtnDown)
ADD_USER_MSG_MAP(MSG_SENSOR_UP,                OnSensorUp)
ADD_USER_MSG_MAP(MSG_SENSOR_DOWN,            OnSensorDown)
ADD_USER_MSG_MAP(MSG_SENSOR_LEFT,            OnSensorLeft)
ADD_USER_MSG_MAP(MSG_SENSOR_RIGHT,            OnSensorRight)
ADD_USER_MSG_MAP(SHELL_MSG_LOCK_SCREEN,        OnLockScreen)
END_MSG_MAP()// 实现消息处理函数
BOOL MyClass::OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
{  // 把 lpCreateStruct->lpCreateParams 绑定到 hwnd。  // 通常lpCreateStruct->lpCreateParams 设置 MyClass 对象的 this 指针,在 ::CreateWindowEx() 函数中指定。
ATTACH_OBJ_PTR_TO_WINDOW(hwnd, lpCreateStruct->lpCreateParams);

return TRUE;
}

void MyClass::OnClose(HWND hwnd)
{  // 获取 hwnd 绑定的对象指针,并赋值给局部变量 pvShell
DEFINE_OBJ_PTR_FROM_WINDOW(hwnd, MyClass, pvShell);

pvShell->Destroy();
}

void MyClass::OnDestroy(HWND hwnd)
{
::PostQuitMessage(0);
}

void MyClass::OnPaint(HWND hwnd)
{  // 获取 hwnd 绑定的对象指针,并赋值给局部变量 pvShell
DEFINE_OBJ_PTR_FROM_WINDOW(hwnd, MyClass, pvShell);

paint_dc dc(hwnd);
pvShell->OnDraw(dc);
}

void MyClass::OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)
{
  // ...
}

void MyClass::OnLButtonUp(HWND hwnd, int x, int y, UINT keyFlags)
{
 // ...
}

// 其它消息处理方法
// 。。。。。。


  重要说明:不知大家是否注意到,我们的消息处理函数与 MFC 的消息处理函数是有区别的。区别就在于我们的消息处理函数是 static 类型的,而 MFC 的消息处理函数则不是。因此,MFC 的消息处理函数很容易获得 this 指针,而我们的函数就没那么直接了,因此需要使用了比较迂回的方法获取 this 指针,具体方法是:

  1. 在 ::CreateWindowEx(... , lpParam) 方法中,把 MyClass 的 this 指针作为参数传入。

  2.  处理 WM_CREATE 消息时调用 ATTACH_OBJ_PTR_TO_WINDOW(hwnd, lpCreateStruct->lpCreateParams),把 this 指针绑定到 hwnd。

  3. 在其他消息处理方法中用 GET_OBJ_PTR_FROM_WINDOW 或 DEFINE_OBJ_PTR_FROM_WINDOW 获取 this 指针。


木鱼
乔老爷天堂里的困惑

乔老爷天堂里的困惑

乔老爷天堂里的困惑

走过岁月......

Windows 映射文件夹为分区

映射后的效果如下所示:


映射后的效果如下所示:



 

LOFTER

让兴趣,更有趣

简单随性的记录
丰富多彩的内容
让生活更加充实

下载移动端
关注最新消息