none
Cuadro de dialogo no modal c++ y WIN32

    Pregunta

  • #include "stdafx.h"
    #include "CreateDialog.h"
    #include "windows.h"
    #include "resource.h"
    
    HRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    	MSG message;
    	HWND hWnd;
    	HWND hWnd2;
    	WNDCLASSEX wcex;
    	wcex.cbClsExtra = 0;
    	wcex.cbSize = sizeof(WNDCLASSEX);
    	wcex.cbWndExtra = 0;
    	wcex.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
    	wcex.hCursor = LoadCursor(NULL, IDI_APPLICATION);
    	wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    	wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    	wcex.hInstance = hInstance;
    	wcex.lpfnWndProc = WndProc;
    	wcex.lpszClassName = TEXT("Window Class");
    	wcex.lpszMenuName = NULL;
    	wcex.style = CS_DBLCLKS;
    
    	if (!RegisterClassEx(&wcex)) {
    		return 0;
    	}
    
    	hWnd = CreateWindowEx(0, wcex.lpszClassName, TEXT("Window 1"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 900, 900, NULL, NULL, hInstance, NULL);
    	hWnd2 = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DialogProc);
    	ShowWindow(hWnd, SW_SHOWDEFAULT);
    	ShowWindow(hWnd2, SW_SHOW);
    
    	while (GetMessage(&message, 0, 0, 0) > 0) {
    		TranslateMessage(&message);
    		DispatchMessage(&message);
    	}
    
    	return message.wParam;
    }
    
    HRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    	switch (message) {
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    	default:
    		return DefWindowProc(hWnd, message, wParam, lParam);
    	}
    	return 0;
    }
    
    BOOL CALLBACK DialogProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    	switch (message) {
    	case WM_INITDIALOG:
    		return TRUE;
    		break;
    	case WM_DESTROY:
    		DestroyWindow(hWnd);
    		break; 
    	case WM_COMMAND:
    		switch (wParam) {
    		case IDOK:
    			EndDialog(hWnd, IDOK);
    			break;
    		case IDCANCEL:
    			EndDialog(hWnd, IDCANCEL);
    			break;
    		}
    		break;
    	default:
    		return FALSE;
    	}
    	return TRUE;
    }

    hola gente de los foros de msdn,necesito ayuda para cerrar un cuadro de dialogo no modal,el cual se crea con CreateDialog,,lei en en el windows dev center ,que un cuadro de dialogo no modal se cierra con DestroyWindow,pero no me resulta,el cuadro de dialogo es muy simple,tiene dos botones,un aceptar y un cancelar,como si fuera un messageBox,lo que pasa es que al apretar el botón rojo para cerrar el cuadro no cierra,pero si apreto Aceptar o Cancelar si cierra,esa es mi duda entonces.

    gracias.

    viernes, 2 de marzo de 2018 0:02

Todas las respuestas

  • No debe usar EndDialog() para destruir un diálogo creado con CreateDialog().  Debe usar DestroyWindow().  Su diálogo no cierra porque no procesa WM_CLOSE.  El window procedure por defecto automáticamente llama a DestroyWindow() cuando recibe WM_CLOSE, pero su window procedure (o más bien, dialog procedure) no llama a DefDlgProc() (el default window procedure de diálogos).  Llame a DefDlgProc() en default:.

    Jose R. MCP
    Code Samples

    viernes, 2 de marzo de 2018 0:47
    Moderador