Autor
|
Tema: Iconos en botones (Win API) (Leído 4,522 veces)
|
Alien-Z
Desconectado
Mensajes: 177
C++ Programmer
|
Buenas: He llegado a un punto en el cual, para mejorar la interfaz de un programa, necesito ponerle iconos a los botones, fondos a los edit o static, etc. He encontrado por internet un par de cosas como la función CreateIcon (que me ha dado 500 errores) y esta otra forma: #include <windows.h> enum {ID_BOTON1}; /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); /* Make the class name into a global variable */ char szClassName[ ] = "CodeBlocksWindowsApp"; HINSTANCE estancia; HICON hIcon1; HWND boton1; int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) { HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ estancia = hThisInstance; /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); hIcon1 = LoadIcon (estancia, "RAIZ"); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default colour as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; /* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Code::Blocks Template Windows App", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow (hwnd, nCmdShow); /* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; } /* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { case WM_CREATE: { boton1 = CreateWindow ("Button", NULL, WS_CHILD | WS_VISIBLE | WS_TABSTOP, 20, 90, 40, 25, hwnd, (HMENU) ID_BOTON1, estancia, 0); SendMessage(boton1, WM_SETICON, (WPARAM) hIcon1, true); break; } case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }
Archivo de recursos: RAIZ ICON "raiz.ico"
No me da ningún error y el programa se compila y ejecuta correctamente pero no imprime el icono.
|
|
« Última modificación: 16 Septiembre 2011, 21:53 pm por Alien-Z »
|
En línea
|
|
|
|
Queta
Desconectado
Mensajes: 267
|
|
|
|
En línea
|
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.
|
|
|
Alien-Z
Desconectado
Mensajes: 177
C++ Programmer
|
Gracias pero no entiendo muy bien el code; no sé si es que usa una metodología de programación diferente o es que está programado teniendo presente formas de sintaxis más avanzadas, pero apenas comprendo el "main.cpp". ¿No hay ninguna manera menos compleja como la que he posteado?, ¿dónde podría estar el fallo en mi code?, reitero en que hace realtivamente poco que me puse a explorar la API de Windows y aunque sepa usar funciones muy diversas tampo soy un experto. Saludos.
|
|
« Última modificación: 16 Septiembre 2011, 22:47 pm por Alien-Z »
|
En línea
|
|
|
|
Queta
Desconectado
Mensajes: 267
|
¿No entiendes el main.cpp? Tu código me parece que es una plantilla, ¿lo entiendes?
|
|
« Última modificación: 16 Septiembre 2011, 23:17 pm por Queta »
|
En línea
|
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.
|
|
|
Alien-Z
Desconectado
Mensajes: 177
C++ Programmer
|
¿No entiendes el main.cpp? Tu código me parece que es una plantilla, ¿lo entiendes?
Lo que está comentado en inglés es lo que da como plantilla Code::Blocks, lógicamente no voy a escribir lo básico para programar una ventana cada vez que cree un proyecto para probar funciones y hacer ensayos, en ese caso el código que da Code::Blocks al crear un nuevo proyecto viene a la perfección. No, no entiendo el main.cpp que va con el source del ejemplo que me has pasado por la sencilla razón de que al ser principiante en Win API la única forma que he visto para crear ventanas es la que viene con Code::Blocks y en los ejemplos básicos de guías y foros; si empieza a crear 39898 archivos para hacer una simple ventana lo normal al ser un principiante, noob o como quieras llamarlo es que no me entere. ¿Tantos archivos para añadirle un ICONO a un BOTÓN?.
|
|
« Última modificación: 16 Septiembre 2011, 23:41 pm por Alien-Z »
|
En línea
|
|
|
|
|
Alien-Z
Desconectado
Mensajes: 177
C++ Programmer
|
Gracias por tu tiempo, pero no estoy interesando en volver a dar lo que ya he visto, sé cómo crear una ventana; lo que no comprendo son las funciones que hay en el "main.cpp" de tu ejemplo que no tienen nada que ver con la ventana en si, sino que llaman a funciones de los otros 8 archivos dificultando su comprensión. La idea es avanzar poco a poco no verme 15 funciones nuevas de golpe repartidas entre 8 archivos. No te molestes, miraré por otro lado. Suerte.
|
|
« Última modificación: 17 Septiembre 2011, 00:18 am por Alien-Z »
|
En línea
|
|
|
|
|
Alien-Z
Desconectado
Mensajes: 177
C++ Programmer
|
Muchas gracias, era exactamente lo que buscaba. Aclaro un pequeño punto que no sale en la MSDN por si alguien ojea este tema: BM_SETIMAGE no funciona en Windows XP sino añades BS_ICON o BS_BITMAP al definir el botón/edit/static/etcétera. Un ejemplo: case WM_CREATE: { //Esto funcionaría en W7 pero no en XP boton1 = CreateWindow ("Button", NULL, WS_CHILD | WS_VISIBLE | WS_TABSTOP, 20, 90, 40, 25, hwnd, (HMENU) ID_BOTON1, estancia, 0); SendMessage(boton1, BM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM)hIcon1); break; }
case WM_CREATE: { //Ahora lo reconoce el Windows XP boton1 = CreateWindow ("Button", NULL, BS_ICON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 20, 90, 40, 25, hwnd, (HMENU) ID_BOTON1, estancia, 0); SendMessage(boton1, BM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM)hIcon1); break; }
En caso de que sea una imagen en vez de BS_ICON hay que usar BS_BITMAP. Saludos.
|
|
« Última modificación: 17 Septiembre 2011, 17:37 pm por Alien-Z »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
OCX Botones XP
Programación Visual Basic
|
al3
|
9
|
6,658
|
3 Diciembre 2005, 02:22 am
por Kizar
|
|
|
Botones en VB
Programación Visual Basic
|
TheCrash
|
4
|
2,024
|
23 Enero 2006, 01:52 am
por TheCrash
|
|
|
Botones vb6
Programación Visual Basic
|
rixi15
|
5
|
4,205
|
9 Enero 2007, 21:10 pm
por _DRIGIN_
|
|
|
Formato de Imgenes de iconos para Botones en Visual BASic?
« 1 2 »
Programación Visual Basic
|
ositocaro
|
10
|
17,930
|
16 Septiembre 2010, 15:04 pm
por raul338
|
|
|
Como Lograr Menus vistosos, y Iconos y botones con degradado?
« 1 2 »
Programación Visual Basic
|
ositocaro
|
13
|
19,250
|
8 Noviembre 2010, 20:39 pm
por ranslsad
|
|