<html><body><div style="color:#000; background-color:#fff; font-family:times new roman, new york, times, serif;font-size:12pt"><div><span>Hola, he seguido el ejemplo que me has puesto, que basicamente era lo que estaba haciendo yo, pero sigue sin hacer nada. Solo veo una diferencia y es que tu lo haces en la gestión del mensage WM_CREATE y yo lo hago en el WM_INITDIALOG ya que el boton está en en un dialogo que abro con CreateDialogParam en unas ocasiones y en otras con DialogBoxParam (aunque esta vez probe con uno abierto con la primera de las dos). Te voy a poner el codigo que he usado a ver si ves algo que se me escape.</span></div><div><br><span></span></div><div><span>#include "includes.h"<br><br>BOOL CALLBACK WProcPuntoProp(HWND hdwnd,UINT message, WPARAM wParam, LPARAM lParam)<br>{<br> static HINSTANCE hInstance;<br> HDC hDC;<br> PAINTSTRUCT ps;<br> RECT
clien;<br> HBRUSH hbrush;<br> HPEN hpen;<br> static HDC hDcmem;<br> static PointProp* vistaprevia;<br> static PointProp* Param;<br> static PointProp Param_antiguo;<br> static HBITMAP hBitmap;<br> static HDC hCompatibleDC;<br> RECT re = {0, 0, 63, 19};<br> static HBITMAP hBitmap1;<br><br> switch(message){<br><br> case WM_INITDIALOG:<br> hInstance = ((LPCREATESTRUCT)lParam)->hInstance;<br><br> Param = (PointProp*)lParam;<br> Param_antiguo = *Param;<br><br>
vistaprevia = new PointProp(31,Param->GetTipo(),Param->GetColor(), Param->GetRelleno());<br><br> if(Param->GetRelleno() == true)<br> {<br> CheckDlgButton(hdwnd,IDC_CHECKBOX_RELLENO,BST_CHECKED);<br> }<br><br> GetClientRect(hdwnd,&clien);<br><br> hDC = GetDC(hdwnd);<br> hDcmem = CreateCompatibleDC(hDC);<br> hBitmap =
CreateCompatibleBitmap(hDC,clien.right,clien.bottom);<br> hCompatibleDC = CreateCompatibleDC(hDC);<br> hBitmap1 = CreateCompatibleBitmap(hDC, 64, 20);<br> SelectObject(hCompatibleDC, hBitmap1);<br> // Dibujar el botón:<br> FillRect(hCompatibleDC, &re, (HBRUSH)GetStockObject(WHITE_BRUSH ));<br> FrameRect(hCompatibleDC, &re, (HBRUSH)GetStockObject(GRAY_BRUSH ));<br> Ellipse(hCompatibleDC, 20, 2, 44, 18);<br>
ReleaseDC(hdwnd,hDC);<br> SelectObject(hDcmem,hBitmap);<br> hpen = CreatePen(PS_SOLID,1,vistaprevia->GetColor());<br> SelectObject(hDcmem,hpen);<br> PatBlt(hDcmem,0,0,clien.right,clien.bottom,PATCOPY);<br> SendDlgItemMessage(hdwnd,IDC_BUTTON1_RESPUNTOPROP, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBitmap);<br> SendDlgItemMessage(hdwnd, IDC_COMBO_TAM,CB_ADDSTRING, 0, (LPARAM)"1");<br> SendDlgItemMessage(hdwnd, IDC_COMBO_TAM,CB_ADDSTRING, 0,
(LPARAM)"3");<br> SendDlgItemMessage(hdwnd, IDC_COMBO_TAM,CB_ADDSTRING, 0, (LPARAM)"5");<br> SendDlgItemMessage(hdwnd, IDC_COMBO_TAM,CB_ADDSTRING, 0, (LPARAM)"7");<br> SendDlgItemMessage(hdwnd, IDC_COMBO_TAM,CB_ADDSTRING, 0, (LPARAM)"9");<br> SendDlgItemMessage(hdwnd, IDC_COMBO_TAM,CB_ADDSTRING, 0, (LPARAM)"11");<br> SendDlgItemMessage(hdwnd, IDC_COMBO_TAM,CB_ADDSTRING, 0, (LPARAM)"15");<br> SendDlgItemMessage(hdwnd, IDC_COMBO_TAM,CB_ADDSTRING, 0, (LPARAM)"21");<br> SendDlgItemMessage(hdwnd,
IDC_COMBO_TAM, CB_SELECTSTRING,(WPARAM)-1, (LPARAM)"7");<br> break;<br><br> case WM_SYSCOMMAND:<br> switch(wParam)<br> {<br> case SC_CLOSE:<br> *Param = Param_antiguo;<br> EndDialog(hdwnd,-1);<br> break;<br> }<br>
break;<br> case WM_COMMAND:<br> switch(LOWORD(wParam)) {<br> case IDCANCEL_RESPUNTOPROP:<br> *Param = Param_antiguo;<br> EndDialog(hdwnd, FALSE);<br> break;<br><br> case IDC_CHECKBOX_RELLENO:<br> if(IsDlgButtonChecked(hdwnd,IDC_CHECKBOX_RELLENO)==BST_CHECKED)<br>
{<br> vistaprevia->SetRelleno(true);<br> }else{<br> vistaprevia->SetRelleno(false);<br> }<br> InvalidateRect(hdwnd,NULL,TRUE);<br><br> break;<br><br> case
IDOK_RESPUNTOPROP:<br> InvalidateRect(hdwnd,NULL,TRUE);<br> break;<br> }<br> break;<br><br> case WM_PAINT:<br> hDC = BeginPaint(hdwnd,&ps);<br> GetClientRect(hdwnd,&clien);<br> hbrush = CreateSolidBrush(RGB(240,240,240));<br> SelectObject(hDcmem,hbrush);<br>
PatBlt(hDcmem,0,0,clien.right,clien.bottom,PATCOPY);<br> vistaprevia->Figura(hDcmem,45,65);<br> BitBlt(hDC,0,0,clien.right,clien.bottom,hDcmem,0,0,SRCCOPY);<br> EndPaint(hdwnd,&ps);<br> break;<br><br> return TRUE;<br> }<br> return FALSE;<br>}<br></span></div><div><br><span></span></div><div><span>/////////////////////////////////</span></div><div><span>El fichero de recursos es <br></span></div><div>/////////////////////////////////</div><div><br></div><div>LANGUAGE 0, SUBLANG_NEUTRAL<br>IDD_RESPUNTOPROP DIALOG 0, 0, 221, 121<br>STYLE DS_3DLOOK | DS_ABSALIGN | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT |
WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU | WS_MINIMIZEBOX<br>CAPTION "Detalles de Puntos"<br>FONT 8, "Ms Shell Dlg"<br>{<br> DEFPUSHBUTTON "Ok", IDOK_RESPUNTOPROP, 8, 99, 50, 14<br> PUSHBUTTON "Cancelar", IDCANCEL_RESPUNTOPROP, 71, 99, 50, 14<br> LTEXT "Vista Previa", IDC_STATIC_RESPUNTOPROP, 12, 16, 38, 8, SS_LEFT<br> AUTOCHECKBOX "Relleno", IDC_CHECKBOX_RELLENO, 12, 65, 50, 10<br> LTEXT "Tamaño", IDC_STATIC_RESPUNTOPROP, 103, 29, 27, 8, SS_LEFT<br> LTEXT "Símbolo", IDC_STATIC_RESPUNTOPROP, 104, 46, 26, 8, SS_LEFT<br> COMBOBOX IDC_COMBO_TAM,
135, 25, 39, 130, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP<br> COMBOBOX IDC_COMBO2_RESPUNTOPROP, 135, 45, 41, 12, CBS_DROPDOWN | CBS_HASSTRINGS<br> LTEXT "Color", IDC_STATIC_RESPUNTOPROP, 104, 68, 17, 8, SS_LEFT<br> PUSHBUTTON "Negro", IDC_BUTTON1_RESPUNTOPROP, 125, 65, 85, 15, BS_BITMAP | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP<br>}<br><br><span></span></div><div><br></div> <div style="font-family: times new roman, new york, times, serif; font-size: 12pt;"> <div style="font-family: times new roman, new york, times, serif; font-size: 12pt;"> <div dir="ltr"> <font face="Arial" size="2"> <hr size="1"> <b><span style="font-weight:bold;">De:</span></b> Salvador Pozo <salvador@conclase.net><br> <b><span style="font-weight: bold;">Para:</span></b>
cconclase@listas.conclase.net <br> <b><span style="font-weight: bold;">Enviado:</span></b> Domingo 4 de marzo de 2012 14:53<br> <b><span style="font-weight: bold;">Asunto:</span></b> Re: [C con Clase] Crear un Bitmap en tiempo de ejecucion y usarlo como fondo de un boton<br> </font> </div> <br>El pasado 2012-03-03 13:54:01, clom escribió:<br> <br>c> ...<br>c> Alguien tiene idea de como puedo hacer lo que quiero o por que no funciona lo que estoy intnetando? <br><br>Hola:<br><br>Sólo se me ocurre que estés haciendo algo mal, porque yo lo he intentado y si me funciona (aunque reconozco que me ha costado un poco :))<br><br>Sigue un pequeño ejemplo:<br><br>----8<------<br> HWND hctrl;<br> // Declaraciones necesarias:<br> static HDC hCompatibleDC;<br> RECT re = {0, 0, 63, 19};<br> HDC hDC;<br><br> switch (msg)
/* manipulador del mensaje */<br> {<br> case WM_CREATE:<br> hInstance = ((LPCREATESTRUCT)lParam)->hInstance;<br> /* Insertar controles */<br> hctrl = CreateWindowEx(<br> 0,<br> "BUTTON", /* Nombre de la clase */<br> "Bitmap", /* Texto del título */<br> BS_BITMAP | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, <br> 160, 69, /* Posición */<br> 95, 24, /* Tamaño */<br>
hwnd, /* Ventana padre */<br> (HMENU)ID_BOTON5,/* Identificador del control */<br> hInstance, /* Instancia */<br> NULL); /* Sin datos de creación de ventana */<br><br> // Parte del código para crear un bitmap<br> hDC=GetDC(hwnd);<br> hCompatibleDC = CreateCompatibleDC(hDC);<br> hBitmap = CreateCompatibleBitmap(hDC, 64, 20);<br> SelectObject(hCompatibleDC, hBitmap);<br> // Dibujar el botón:<br> FillRect(hCompatibleDC, &re, (HBRUSH)GetStockObject(WHITE_BRUSH
));<br> FrameRect(hCompatibleDC, &re, (HBRUSH)GetStockObject(GRAY_BRUSH ));<br> Ellipse(hCompatibleDC, 20, 2, 44, 18);<br> // Liberar los DCs<br> ReleaseDC(0, hDC);<br> DeleteDC(hCompatibleDC);<br><br> SendMessage(hctrl, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBitmap);<br> return 0;<br>...<br> case WM_DESTROY:<br> // Al destruir el diálogo destruir el bitmap:<br> DeleteObject(hBitmap);<br>...<br>----8<------<br><br>Para modificar el bitmap deberás volver a crear un DC compatible, seleccionar el bitmap en él, volver a dibujarlo y liberar el DC.<br><br>Supongo que habrá algunas diferencias entre este
ejemplo y tu código.<br><br>Suerte, hasta pronto.<br><br>-- <br>Salvador Pozo (Administrador)<br>mailto:<a ymailto="mailto:salvador@conclase.net" href="mailto:salvador@conclase.net">salvador@conclase.net</a><br>_______________________________________________<br>Lista de correo Cconclase <a ymailto="mailto:Cconclase@listas.conclase.net" href="mailto:Cconclase@listas.conclase.net">Cconclase@listas.conclase.net</a><br><a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br><br><br> </div> </div> </div></body></html>