亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

MFC中自定義窗口類名

2019-11-17 03:49:50
字體:
來源:轉載
供稿:網友
MFC中封裝很多常用的控件,把類名也給封裝了,沒有提供明顯的接口出來,用win api寫窗口程序,第一步就是注冊窗口類

此時類名和標題名是一起注冊的,所以能把標題很好地讓用戶來設定,類名也應該是很簡單的,可惜的是MFC沒有這樣做,原因也許是window name可以不停的改,而類名不能。窗口的類名是有Create來確定的,要在Create前,給窗口選擇一個已經注冊的窗口類名,作為參數窗口Create就ok了,CWnd的Create最終還是到了CreateEx中來,看看CreateEx就會清楚許多



BOOL CWnd::CreateEx(DWord dwExStyle, LPCTSTR lpszClassName,        LPCTSTR lpszWindowName, DWORD dwStyle,        const RECT& rect, CWnd* pParentWnd, UINT nID,        LPVOID lpParam /* = NULL */){    return CreateEx(dwExStyle, lpszClassName, lpszWindowName, dwStyle,        rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,        pParentWnd->GetSafeHwnd(), (HMENU)(UINT_PTR)nID, lpParam);}BOOL CWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,    LPCTSTR lpszWindowName, DWORD dwStyle,    int x, int y, int nWidth, int nHeight,    HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam){    ASSERT(lpszClassName == NULL || AfxIsValidString(lpszClassName) ||         AfxIsValidAtom(lpszClassName));    ENSURE_ARG(lpszWindowName == NULL || AfxIsValidString(lpszWindowName));        // allow modification of several common create parameters    CREATESTRUCT cs;    cs.dwExStyle = dwExStyle;    cs.lpszClass = lpszClassName;    cs.lpszName = lpszWindowName;    cs.style = dwStyle;    cs.x = x;    cs.y = y;    cs.cx = nWidth;    cs.cy = nHeight;    cs.hwndParent = hWndParent;    cs.hMenu = nIDorHMenu;    cs.hInstance = AfxGetInstanceHandle();    cs.lpCreateParams = lpParam;    if (!PReCreateWindow(cs))    {        PostNcDestroy();        return FALSE;    }    AfxHookWindowCreate(this);    HWND hWnd = ::AfxCtxCreateWindowEx(cs.dwExStyle, cs.lpszClass,            cs.lpszName, cs.style, cs.x, cs.y, cs.cx, cs.cy,            cs.hwndParent, cs.hMenu, cs.hInstance, cs.lpCreateParams);#ifdef _DEBUG    if (hWnd == NULL)    {        TRACE(traceAppMsg, 0, "Warning: Window creation failed: GetLastError returns 0x%8.8X/n",            GetLastError());    }#endif    if (!AfxUnhookWindowCreate())        PostNcDestroy();        // cleanup if CreateWindowEx fails too soon    if (hWnd == NULL)        return FALSE;    ASSERT(hWnd == m_hWnd); // should have been set in send msg hook    return TRUE;}
可以看到最后到了::AfxCtxCreateWindowEx,可以很容易地知道這里調用了CreateWindowEx來創建一個窗口



在前面有一個PreCreateWindow(cs),而cs經過PreCreateWindow處理后,交給::AfxCtxCreateWindowEx處理

::AfxCtxCreateWindowEx在中轉給CreateWindowEx,cs.lpszClass就是類名,可以清楚了AfxCtxCreateWindowEx的用心良苦




我們可以重載的PreCreateWindow,來修改類名,如下的代碼:



// TODO: 在此添加專用代碼和/或調用基類    //VERIFY(AfxDeferRegisterClass(AFX_WND_REG));    //AfxEndDeferRegisterClass(AFX_WND_REG);    //cs.lpszClass = AfxRegisterWndClass(NULL);    WNDCLASS wndcls;    memset(&wndcls, 0, sizeof(WNDCLASS));   // start with NULL    // defaults    wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;    //you can specify your own window procedure    wndcls.lpfnWndProc = ::DefWindowProc;     wndcls.hInstance = AfxGetInstanceHandle();    wndcls.hIcon =  NULL; // or load a different icon    wndcls.hCursor =NULL;    wndcls.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);    wndcls.lpszMenuName = NULL;    // Specify your own class name for using FindWindow later    wndcls.lpszClassName = _T("MyNewClass");    // Register the new class and exit if it fails    if(!AfxRegisterClass(&wndcls))    {        TRACE("Class Registration Failed/n");        return FALSE;    }    cs.lpszClass = wndcls.lpszClassName;    return TRUE;    //return CWnd::PreCreateWindow(cs);


其實就是為了把一個已經注冊的類名字符串傳給CreateWindowEx,從上面代碼中的注釋中來看,我還用了一種讓系統來生成className的方法AfxRegisterWndClass。CWnd::PreCreateWindow不符合我的心意,注釋掉了,其實里面也沒什么就是判斷而已。而在MFC中CWnd其他派生類就不這么簡單了,不過單純的修改類名,就重載這個方法大多就ok了。

是的,只是大多數可以的,可惜的是這個方法,對于Dialog來說并不行,因為它不用CWnd::Create,也就繞不到

PreCreateWindow上來了,你可以重載對話框的這個方法,斷點,是斷不下來的。因為CDialog的創建可以直接用系統的api來搞,不用再勞駕CWnd來中轉到CReateWindowEx了,所以就不能夠用上述方法來改對話框的類名了。

看下它的創建代碼了:


BOOL CDialog::Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd){    ASSERT(IS_INTRESOURCE(lpszTemplateName) ||        AfxIsValidString(lpszTemplateName));    m_lpszTemplateName = lpszTemplateName;  // used for help    if (IS_INTRESOURCE(m_lpszTemplateName) && m_nIDHelp == 0)        m_nIDHelp = LOWORD((DWORD_PTR)m_lpszTemplateName);#ifdef _DEBUG    if (!_AfxCheckDialogTemplate(lpszTemplateName, FALSE))    {        ASSERT(FALSE);          // invalid dialog template name        PostNcDestroy();        // cleanup if Create fails too soon        return FALSE;    }#endif //_DEBUG    HINSTANCE hInst = AfxFindResourceHandle(lpszTemplateName, RT_DIALOG);    HRSRC hResource = ::FindResource(hInst, lpszTemplateName, RT_DIALOG);    HGLOBAL hTemplate = LoadResource(hInst, hResource);    BOOL bResult = CreateIndirect(hTemplate, pParentWnd, hInst);    FreeResource(hTemplate);    return bResult;}



可以看出來CDialog是靠資源來創建的,可以這樣來來搞的,在資源腳本中定義Class “對話框類名”在對話框domodal或者Create前注冊這個類名,然后等著modal和Create后就可以了。





這段時間,一直忙一些其他方面了,對MFC封裝機制淡忘了不少,跟蹤下代碼,算是溫習一下了。




發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97国产精品视频人人做人人爱| 日韩高清电影免费观看完整版| 97精品伊人久久久大香线蕉| 国产精品扒开腿做爽爽爽男男| 欧美国产日韩免费| 成人激情视频小说免费下载| 久久躁日日躁aaaaxxxx| 久久精品一偷一偷国产| 亚洲天堂免费在线| 欧美刺激性大交免费视频| 欧美色欧美亚洲高清在线视频| 91免费看片在线| 久热精品视频在线观看一区| 久久视频免费在线播放| 久久精品人人做人人爽| 国产色综合天天综合网| 热久久这里只有精品| 午夜精品一区二区三区视频免费看| 国产精品视频播放| 久久久久久网站| 欧美伊久线香蕉线新在线| 日韩在线免费视频观看| 欧美色播在线播放| 少妇高潮久久77777| 亚洲人午夜精品免费| 国产女精品视频网站免费| 国产日韩欧美在线观看| 亚洲jizzjizz日本少妇| 亚洲欧美日韩国产精品| 国产精品99久久久久久www| 国产日韩欧美自拍| 69久久夜色精品国产69乱青草| 亚洲日韩欧美视频| 日韩a**中文字幕| 好吊成人免视频| 日日狠狠久久偷偷四色综合免费| 国产区精品在线观看| 久久精品国产69国产精品亚洲| 国产精品中文字幕在线| 成人中文字幕+乱码+中文字幕| 欧美人与物videos| 久久久久久国产精品美女| 精品日韩美女的视频高清| 国产小视频91| 久久久精品久久| 国产欧美日韩中文| 色av吧综合网| 色yeye香蕉凹凸一区二区av| 91免费人成网站在线观看18| 亚洲毛片在线看| 国产精品久久久| 午夜免费日韩视频| 国产成人综合精品在线| 一区二区三区回区在观看免费视频| 2019国产精品自在线拍国产不卡| 精品福利一区二区| 日韩成人中文字幕在线观看| 亚洲国产99精品国自产| 国产精品va在线播放| 国产一区二区激情| 亚洲免费电影一区| 亚洲一区二区中文| 久久久精品国产亚洲| 亚洲免费av电影| 亚洲视频777| 日韩在线观看免费全集电视剧网站| 国产香蕉精品视频一区二区三区| 国产一区二区三区四区福利| 久久久噜噜噜久久| 亚洲最大中文字幕| 欧美在线亚洲一区| 久久久精品久久久| 国产精品久久久久久久久男| 国产精品一区二区三区久久久| 亚洲人成绝费网站色www| 欧美在线观看网址综合| 国产精品日韩欧美综合| 欧美孕妇性xx| 97视频在线看| 久久91精品国产91久久跳| 欧美大片在线免费观看| 最新亚洲国产精品| 欧美大奶子在线| 久久久亚洲欧洲日产国码aⅴ| 精品国产一区二区三区久久久| 国产精品十八以下禁看| 久久久黄色av| 国产精品v日韩精品| 日韩成人av网址| 亚洲国产精品va在看黑人| 日韩在线播放视频| 国产日韩在线视频| 深夜福利亚洲导航| 日韩免费观看网站| 亚洲性生活视频| 欧美最猛性xxxxx(亚洲精品)| 国产精品18久久久久久麻辣| 欧美在线激情网| 91在线视频九色| 国产日韩综合一区二区性色av| 在线播放国产一区中文字幕剧情欧美| 亚洲a级在线播放观看| 久久九九全国免费精品观看| 精品国内自产拍在线观看| 欧美电影《睫毛膏》| 精品成人久久av| 亚洲国产婷婷香蕉久久久久久| 国产精品爽黄69天堂a| 国产一区深夜福利| 欧美日韩国产综合视频在线观看中文| 在线电影欧美日韩一区二区私密| 91av在线精品| 黄色成人av在线| 欧美激情欧美狂野欧美精品| 国产精品99久久99久久久二8| 国产精品高潮呻吟久久av无限| xxxxxxxxx欧美| 亚洲xxxxx| 久久久黄色av| 在线播放日韩欧美| 国产成人av网址| 国产精品久久久久国产a级| 国产成人精品一区| 成人性生交大片免费看视频直播| 欧美国产高跟鞋裸体秀xxxhd| 日韩成人在线视频观看| 亚洲最大福利视频网站| 亚洲黄色片网站| 亚洲精品久久在线| 亚洲欧洲在线视频| 亚洲女人天堂色在线7777| 国产xxx69麻豆国语对白| 韩国欧美亚洲国产| 国产精品自拍网| 日韩精品亚洲视频| 亚洲激情久久久| 亚洲成人久久久久| 亚洲天堂av综合网| 国产视频丨精品|在线观看| 一级做a爰片久久毛片美女图片| 日韩欧美aⅴ综合网站发布| 亚洲国产天堂久久综合网| 久久久久久999| 精品国产区一区二区三区在线观看| 国产精品一区二区久久精品| 欧美激情精品久久久久久免费印度| 成人免费视频97| 国模吧一区二区三区| 欧美亚洲一区在线| 亚洲人av在线影院| 日本欧美一二三区| 92国产精品久久久久首页| 亚洲图片欧美日产| 欧美亚洲另类激情另类| 亚洲国产另类 国产精品国产免费| 亚洲无限乱码一二三四麻| 夜夜嗨av色综合久久久综合网| 国产98色在线| 神马国产精品影院av| 青青青国产精品一区二区| 日韩精品有码在线观看| 久久99国产精品自在自在app| 欧美性极品少妇精品网站| 欧美乱妇高清无乱码|