2010-11-29 11 views
5

दिखाई नहीं देता है मैं एक अजीब समस्या से फंस गया हूं। मैं वीसी ++ 2008 में एक Win32 एप्लिकेशन बना रहा हूं, MessageBox पर कॉल करते समय आसान पुनरावृत्ति के लिए अधिकांश कार्यों को एक कक्षा बनाने के लिए कक्षा बना रहा हूं। संदेश बॉक्स 'बनाया गया है (मुझे लगता है) लेकिन जब तक मैं Alt कुंजी दबाता हूं तब तक दिखाई नहीं देता है!Win32 MessageBox

क्या वास्तव में है:

  1. मैं कार्यक्रम चलाने

  2. Enter दबाएं

  3. मुख्य विंडो ध्यान केंद्रित

  4. जब मैं पर क्लिक करें बीप ध्वनि देना खोना मुख्य विंडो जैसे कि एक मॉडल संदेशबॉक्स मौजूद है

  5. या तो प्रेस एस्केप ... फोकस प्राप्त होता है या Alt दबाएं तो संदेश बॉक्स को दबाए गए alt कुंजी के साथ दिखाई देता है (यानी। मेनू गिर जाएगा) !!!!!!

पीएस यह ठीक काम कर रहा था लेकिन अचानक यह हुआ। मुझे कोई फर्क नहीं मिला - मैंने एक नई परियोजना भी बनाई!

यह मुख्य कार्यक्रम माना जाता है:

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int  nCmdShow) 
{ 
    MSG msg; 
    CWnd cMainWindow(TEXT("DentoMan"), TEXT("Bejkoman")); // pass The class name and window name to the constructor 

    cMainWindow.CreateDef(); //Create the Window 
    while (GetMessage(&msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    return (int)msg.wParam; 
} 

जबकि इस वर्ग फ़ाइल है

CWnd::CWnd() { 
}; 

CWnd::CWnd(LPTSTR lpszClassName, LPTSTR lpszWindowName) { 
    CWnd::lpszClassName  = lpszClassName; 
    CWnd::lpszWindowName = lpszWindowName; 
}; 

CWnd::~CWnd() { 
}; 

// Create the window with default parameters 
HWND CWnd::CreateDef(void) { 
    WNDCLASSEX wcex; 

    wcex.cbSize = sizeof(WNDCLASSEX); 

    wcex.style   = CS_HREDRAW | CS_VREDRAW; 
    wcex.lpfnWndProc = StaticWndProc; 
    wcex.cbClsExtra  = 0; 
    wcex.cbWndExtra  = 0; 
    wcex.hInstance  = (HINSTANCE)GetModuleHandle(NULL); 
    wcex.hIcon   = 0; 
    wcex.hCursor  = LoadCursor(NULL, IDC_ARROW); 
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 4); 
    wcex.lpszMenuName = 0; 
    wcex.lpszClassName = lpszClassName; 
    wcex.hIconSm  = 0; 

    RegisterClassEx(&wcex); 
    g_hWnd = CreateWindowEx(0,lpszClassName, lpszWindowName, WS_OVERLAPPEDWINDOW, 
     CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, wcex.hInstance, this); 
    hInst = wcex.hInstance; //Store hInstance in the class hInst variable 

    if (!g_hWnd) return false; 
    ShowWindow(g_hWnd, SW_SHOW); 
    UpdateWindow(g_hWnd); 

    return g_hWnd; 
} 

LRESULT CALLBACK CWnd::StaticWndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { 
    /* The Only Message we take here so we store the 'this' pointer within the window to identify messages 
    comming from it by the 'this' pointer*/ 
    if (Message == WM_CREATE) { 
     SetWindowLong(hWnd, GWL_USERDATA, (LONG)((CREATESTRUCT FAR *)lParam)->lpCreateParams); 
    } 

    /* Store the window pointer in the class pointer we just created in order to run the right public WndPRoc */ 
    CWnd *Destination = (CWnd*)GetWindowLong(hWnd, GWL_USERDATA); 

    // If the hWnd has a related class, pass it through 
    if (Destination) { 
     return Destination->WndProc(hWnd, Message, wParam, lParam); 
    } 

    // No destination found, defer to system... 
    return DefWindowProc(hWnd, Message, wParam, lParam); 
}; 

LRESULT CWnd::WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { 
    // Determine message type 
    switch (Message) { 
     case WM_LBUTTONDOWN: 
      { 
       /* this is a common trick for easy dragging of the window.this message fools windows telling that the user is 
       actually dragging the application caption bar.*/ 
       SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION,NULL); 
       break; 
      } 

     /*case WM_CREATE: 
      break; 
    */ 

     case WM_CLOSE: 
      PostQuitMessage(0); 
      break; 

     case WM_DESTROY: 
      UnregisterClass(lpszClassName, hInst); 
      PostQuitMessage(0); 
      break; 

     case WM_KEYDOWN: //KeyBoard keys 
      // Which key was pressed? 
      switch (wParam) { 
       case VK_ESCAPE: //close through escape key 
        PostQuitMessage(0); 
        return 0; 
       case VK_RETURN: 
        MessageBox(hWnd, TEXT("DFGDGD"), TEXT("DFGDFG"), NULL); 
        return 0; 
      } // End Switch 

      break; 

     case WM_COMMAND: 
      /*switch(LOWORD(wParam)) 
     { 
     }*/ 
     break; 

     case WM_PAINT: 
      break; 

     default: 
      return DefWindowProc(hWnd, Message, wParam, lParam); 

    } // End Message Switch 

return 0; 
}; 

कक्षा हैडर:

class CWnd { 
    public: 
     CWnd(); 
     CWnd(LPTSTR lpszClassName, LPTSTR lpszWindowName); 
     virtual ~CWnd(); 
     virtual HWND CreateDef(void);   // Create the window with default parameters 
     virtual LRESULT  WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam); 

    private: 
     static LRESULT CALLBACK StaticWndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam); 
     HWND  g_hWnd;  //Global window handle for this window 
     HINSTANCE hInst;  //Global instance for this window 

     LPTSTR   lpszClassName; 
     LPTSTR   lpszWindowName; 
}; 

पी.एस. मैंने सभी आवश्यक हेडर फाइल शामिल है, सब कुछ MessageBox

को छोड़कर ठीक हो जाता है यह भी आप CreateWindowEx में WS_CHILD पास करना चाहिए here

+2

यहां प्रासंगिक कोड पोस्ट करें। इसके अलावा, अंधेरे में एक शॉट: संदेश बॉक्स दिखाते समय एक पैरेंट विंडो निर्दिष्ट करें। –

+4

संपादित, लिंक हटा दिया गया। असुरक्षित .exe फ़ाइलों को पोस्ट न करें .. बस प्रासंगिक कोड पेस्ट करें। – Ruel

+0

... या आप कोड को [ideone] (http://ideone.com/) या [pastebin] (http://pastebin.com/) – Vlad

उत्तर

8

Ohhhhhhh अंत में मैं इस समस्या का समाधान मिल गया ... और हर किसी को लाभ पहुंचाने के लिए के लिए समस्या पर WM_PAINT संदेश WndProc (.......) में था मैं इसमें कुछ कोड लिखा है और हटाया सभी कोड BeginPaint और EndPaint फ़ंक्शंस के साथ-साथ प्रोग्राम उस पर पिक्चर किए जाने के बाद फ्रीज अवधि दर्ज करते हैं, लेकिन उस संदेशबॉक्स सहित, लेकिन यह केवल तब दिखाता है जब मैं Alt दबाता हूं, मुझे लगता है कि नियंत्रण को उस चरण में सिस्टम में स्थानांतरित किया गया है प्रणाली मेनू (मुझे लगता है कि)

समाधान या तो WM_PAINT संदेश प्रबंधक को निकाल या सामान्य BeginPaint और EndPaint कार्यों को जोड़ने

जो मेरे सवाल पर पारित हर किसी के लिए

धन्यवाद

2

पर कोड का कोई लिंक जब आप अपने MessageBox पैदा करते हैं।
संपादित 2:
ठीक है इसे आजमाएं।

MessageBox(hWnd, TEXT("DFGDGD"), TEXT("DFGDFG"), MB_OK); 
+0

मैं इसे नहीं कर सकता Ramilol यह मेरी मुख्य खिड़की है, मैं इसके माध्यम से MessageBox फ़ंक्शन को बुला रहा हूं ... –

+0

खेद है कि मुझे यह नहीं पता था ... मैं वास्तव में समझ नहीं पा रहा हूं कि आपका क्या कहना है .. आपका संदेश बॉक्स नहीं है दिखाना या आपकी मुख्य खिड़की नहीं? – Ramilol

+0

हो जाने पर क्या है: 1 - मैं इस कार्यक्रम को चलाने के 2 - Enter दबाएं 3 - मुख्य विंडो ध्यान केंद्रित खो 4 - जब मैं मुख्य विंडो पर क्लिक करें के रूप में अगर एक मॉडल MessageBox मौजूद है बीप ध्वनि देना 5 - या तो प्रेस एस्केप ... फोकस प्राप्त होता है या Alt दबाएं तो संदेश बॉक्स को दबाए गए alt कुंजी के साथ दिखाई देता है (यानी मेनू ड्रॉप हो जाएगा !!!!!! –

3

अगर किसी को अब भी रुचि रखता है, इस विधि काम करता है:

MessageBox(NULL,L"error",L"Error",MB_ICONERROR|MB_DEFAULT_DESKTOP_ONLY); 
2

मैं एक ऐसी ही समस्या यह है कि WM_PAINT द्वारा कारण था किसी को जैसा कि ऊपर उल्लेख किया था।वहां return DefWindowProc(hWnd, Message, wParam, lParam); जोड़कर इसे हल किया गया।