• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Sleeping

            Note Book

            2008年10月7日 #

            DialogBox的若干問(wèn)題

            今天繼續(xù)折騰那個(gè)List Box控件,發(fā)現(xiàn)一個(gè)問(wèn)題,當(dāng)對(duì)話(huà)框出來(lái)之后,被主窗體給刷屏了,不能得到子窗體的句柄。后經(jīng)仔細(xì)調(diào)試,發(fā)現(xiàn)一些端倪。首先在調(diào)用 DialogBox函數(shù)時(shí) ,所生成的Dialog(我這里的Dialog面板里有一個(gè)Edit控件 兩個(gè)按鈕控件 和一個(gè)List Box控件)依次產(chǎn)生的消息隊(duì)列如下所示:
            WM_SETFONT    0x0030                 設(shè)置字體
            WM_INITDIALOG 0x0110                 初始化Dialog
            WM_WINDOWPOSCHANGING            0x0046                窗體大小 位置等轉(zhuǎn)變的消息
            WM_NCACTIVATE   0x0086          改變一個(gè)非工作區(qū)域 sent to a window when its nonclient area needs to be changed to indicate an active or inactive state.
            WM_ACTIVATE     0x0006   讓你窗體無(wú)效 并激活子窗體
            WM_COMMAND   0x0111 (HIWORD(WPARAM))->LBN_SETFOCUS(4) ->LBN_KILLFOCUS(5) 消息命令 ListBox
            WM_USER     0x0400    用戶(hù)自定義消息
            WM_NCACTIVATE  0x0086
            WM_SHOWWINDOW   0x0018   顯示窗體
            WM_WINDOWPOSCHANGING 0x0046
            WM_NCPAINT 0x0085    The WM_NCPAINT message is sent to a window when its frame must be painted.
            WM_ERASEBKGND 0x0014   清楚窗口背景
            WM_WINDOWPOSCHANGED 0x0047  
            WM_GETICON 0x007F  3次   The WM_GETICON message is sent to a window to retrieve a handle to the large or small icon associated with a window
            WM_NCCALCSIZE 0x0083   計(jì)算機(jī)窗體大小尺寸
            WM_MOVE 0x0003     移動(dòng)
            WM_SIZE 0x0005     改變大小
            WM_PAINT 0x000F    繪制窗體
            WM_CTLCOLORBTN 0x0135   繪制按鈕的顏色
            WM_CTLCOLORLISTBOX 0x0134  繪制Listbox的顏色
            WM_CTLCOLOREDIT 0x0133   繪制Edit的顏色
            WM_POWERBROADCAST 0x0218   broadcast to an application to notify it of power-management events
            while(1) 一直循環(huán)以下的兩個(gè)消息
            WM_NCACTIVATE  0x0086
            WM_WINDOWPOSCHANGING            0x0046

            代碼如下:
            BOOL CALLBACK  ListBoxTest(HWND hWnd,UINT message , WPARAM wParam, LPARAM lParam) 

            int wmId = LOWORD(wParam ); 
            int wmEvent = HIWORD(wParam) ; 
            int i ; 
            HDC hDc ; 
            PAINTSTRUCT ps ; 
            HWND hListBox ; 
            switch(message) 

              
            case WM_INITDIALOG: 
               hListBox 
            = GetDlgItem(hWnd,IDC_LIST_TEST) ; 
               
            for(i = 0; MyData[i].Name[0!= 0 ; i++

                SendMessage(hListBox,LB_ADDSTRING,
            0,(LPARAM)MyData[i].Name) ; 
                SendMessage(hListBox,LB_SETITEMDATA,  i ,(LPARAM)i) ; 
               }
             
               SetFocus(hListBox); 
               
            return (TRUE) ; 
              
            case WM_PAINT: 
               hDc 
            = BeginPaint(hWnd,&ps) ; 
               
            //MSGPRINT(_T("Print")) ; 
               EndPaint(hWnd,&ps); 
               
            break ; 
              
            case LB_ADDFILE: 
               
            break ; 
              
            case WM_COMMAND: 
               
            switch(wmId) 
            {
             
               
            case IDC_LIST_TEST: 
                
            switch(wmEvent) 
               {
             
                
            case LBN_SELCHANGE: 
                 
            //MSGPRINT(_T("LBN_SELCHANGE")); 
                 break ; 
                
            case LBN_DBLCLK: 
                 
            //MSGPRINT(_T("LBN_DBLCLK")); 
                 break ; 
                
            case LBN_SETFOCUS: 
                 
            //MSGPRINT(_T("LBN_SETFOCUS")) ; 
                 break ; 
                
            case LBN_KILLFOCUS: 
                 
            //MSGPRINT(_T("LBN_KILLFOCUS")) ; 
                 break ; 
                }
             
                
            return FALSE ; 
                
            break ; 
               
            case IDOK: 
                MSGPRINT(_T(
            "IDOK")); 
                EndDialog(hWnd,
            0) ; 
                
            return TRUE; 
                
            break ; 
               
            case IDCANCEL: 
                MSGPRINT(_T(
            "IDCANCEL")); 
                EndDialog(hWnd,
            0) ; 
                
            return TRUE ; 
                
            break ; 
               }
             
            }
             
            return FALSE;
            }

            如果最后返回TRUE那么窗體的著色會(huì)很有問(wèn)題,Dialog的顏色和背景顏色完全一樣,導(dǎo)致不能看到一個(gè)窗體的存在,所以這里必須返回FALSE,
            MSDN作出的解釋如下:Typically, the dialog box procedure should return TRUE if it processed the message, and FALSE if it did not. If the dialog box procedure returns FALSE, the dialog manager performs the default dialog operation in response to the message.
            意即,如果這個(gè)窗體想處理哪個(gè)消息就返回TRUE,如果不想處理這個(gè)消息就返回FALSE,所以在最后應(yīng)該返回False,即默認(rèn)不處理那些消息而只算WM_INITDIALOG 和其它一些IDOK IDCANCEL的消息。
            If the dialog box procedure processes a message that requires a specific return value, the dialog box procedure should set the desired return value by calling SetWindowLong(hwndDlg, DWL_MSGRESULT, lResult) immediately before returning TRUE. Note that you must call SetWindowLong immediately before returning TRUE; doing so earlier may result in the DWL_MSGRESULT value being overwritten by a nested dialog box message.

            這個(gè)嘛   靠 英文 爛!勉勉強(qiáng)強(qiáng)
            如果窗體在處理一個(gè)消息時(shí)需要顯示地返回一個(gè)值,那這個(gè)窗體應(yīng)該在返回TRUE前調(diào)用SetWindoLong(hWndDlg,DWL_MSGRESULT,lpResult)函數(shù)更改想要返回的值.切記一定要馬上調(diào)用該函數(shù)在返回TRUE之前,盡可能早地通過(guò)DWL_MSGRESULT去改寫(xiě)真正的Result,by a nested dialog box message.  他媽的這句怎么翻譯?


            現(xiàn)在都開(kāi)始懷疑弄這些消息有什么用,用MFC肯定是一個(gè)更好的選擇。在List Box里增加和刪除內(nèi)容都是太煩了,都是通過(guò)SendMessage來(lái)完成的。不知道能堅(jiān)持學(xué)到什么時(shí)候。

            posted @ 2008-10-07 21:42 祥子_隨波逐流 閱讀(2064) | 評(píng)論 (0)編輯 收藏

            2008年10月5日 #

            關(guān)于FormatMessage的錯(cuò)誤

            #ifdef UNICODE 
            typedef WCHAR
            * TYPESTR ; 
            typedef WCHAR TYPECHAR ; 
            #else //UNICODE 
            typedef 
            char* TYPESTR ; 
            typedef 
            char TYPECHAR ; 
            #endif 
            #define ERRINFO _T("調(diào)試錯(cuò)誤信息") 

            VOID PrintError(DWORD dwErrNo,TYPESTR szFileName,DWORD LineNo) 

            TCHAR
            * szErrBuff ; // TCHAR 
            TYPESTR szBuff =(TCHAR*) LocalAlloc(LPTR,sizeof(TYPECHAR)*512) ; 
            if(szBuff == NULL) 

              MessageBox(NULL,_T(
            "內(nèi)存分配失敗"),ERRINFO,MB_OK) ; 
              
            return ; 
            }
             
            // 這個(gè)地方報(bào) 讀取位置 0x00000000 時(shí)發(fā)生訪(fǎng)問(wèn)沖突 或者 The variable 'szErrBuff' is being used without being defined. 
                //原因是 包含| FORMAT_MESSAGE_FROM_STRING
            FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 
                                        // | FORMAT_MESSAGE_FROM_STRING, 
                NULL, 
                dwErrNo, 
                MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), 
                (LPTSTR) 
            &szErrBuff, 
                
            sizeof(szErrBuff), 
                NULL) ; 

            #ifdef UNICODE 
            wsprintf(szBuff,L
            "%s 第%d行;錯(cuò)誤信息:%s",szFileName,LineNo,szErrBuff) ; 
            #else 
            sprintf(szBuff,
            "文件名%s 第%d行;錯(cuò)誤信息:%s",szFileName,LineNo,szErrBuff) ; 
            #endif 
            MessageBox(NULL,szBuff,ERRINFO,MB_OK) ; 
            LocalFree((HLOCAL)szErrBuff) ; 
            LocalFree( szBuff); 
            return ; 
            }
             

            VOID TestForPrintError()
            {
                SECURITY_ATTRIBUTES sp;
                sp.nLength 
            = sizeof(sp) ;
                sp.bInheritHandle 
            = FALSE ;
                sp.lpSecurityDescriptor 
            = NULL ;
            #ifdef UNICODE 
                TYPESTR szFileName 
            = _T("d:\\he.txt") ;
            #else
                TYPESTR szFileName 
            = "d:\\he.txt" ;
            #endif
                
            //如何判斷文件是否已經(jīng)存在了?
                HANDLE hFile = CreateFile(szFileName,
                    GENERIC_READ 
            |GENERIC_WRITE | GENERIC_EXECUTE ,
                    NULL, 
            //FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
                    NULL, //&sp,
                    CREATE_ALWAYS, //| OPEN_EXISTING, //如果有這個(gè)會(huì)報(bào) 在沒(méi)有原文件的時(shí)候會(huì)報(bào)系統(tǒng)找不到指定的文件
                    FILE_ATTRIBUTE_NORMAL,
                    NULL) ;
                
            if(hFile ==  INVALID_HANDLE_VALUE)
             
            {
                    DWORD dwErrNo 
            = GetLastError() ;
                    PRINTERROINFO(GetLastError() ,__FILE__,__LINE__) ;
                }

                DWORD lenth ;
                    //這個(gè)函數(shù)好像比較少用了 不支持Unicode
                
            if(!WriteFile(hFile,"hello",4,&lenth,NULL))
                    PRINTERROINFO(GetLastError() ,__FILE__,__LINE__) ;
                CloseHandle(hFile) ;
                
            return ;
            }

            posted @ 2008-10-05 18:30 祥子_隨波逐流 閱讀(639) | 評(píng)論 (0)編輯 收藏

            僅列出標(biāo)題  
            色婷婷综合久久久久中文一区二区| 久久精品一本到99热免费| 国产精品久久久久乳精品爆| 久久国产香蕉一区精品| 久久久午夜精品福利内容| 中文字幕人妻色偷偷久久| 久久国产精品久久久| 思思久久99热只有频精品66| 久久夜色精品国产噜噜亚洲AV| 办公室久久精品| 久久亚洲AV成人无码电影| 久久影院亚洲一区| 成人资源影音先锋久久资源网| 欧美久久久久久午夜精品| 亚洲va中文字幕无码久久不卡| 久久久91人妻无码精品蜜桃HD| 精品久久久久久成人AV| 麻豆久久久9性大片| 99久久婷婷国产一区二区| 日韩av无码久久精品免费| 综合久久精品色| 久久久久久毛片免费看| 色综合久久天天综合| 久久精品国产亚洲av影院| 欧美综合天天夜夜久久| 亚洲国产精品成人久久| 超级97碰碰碰碰久久久久最新 | 久久精品国产99国产电影网 | 成人免费网站久久久| 亚洲精品乱码久久久久久蜜桃图片| 欧美粉嫩小泬久久久久久久 | 久久综合亚洲色HEZYO社区| 中文字幕一区二区三区久久网站| 久久精品天天中文字幕人妻| 亚洲va久久久噜噜噜久久 | 久久婷婷五月综合97色直播| 66精品综合久久久久久久| 青青热久久综合网伊人| 国产精品熟女福利久久AV| 久久久精品久久久久久| 亚洲国产成人久久综合区|