Click here to Skip to main content
15,867,568 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hello everyone!

I would like to start by saying thanks to everyone who takes some time to view this thread and try to help.

I need to make a button that is a child of a main window with following characteristics:

- It has blue background;
- I displays an icon;
- It displays text under icon;
- Text should be bold;
- Text is in Serbian-Cyrillic;

As far as text is concerned, I know there is BS_BOTTOM style to display it at the bottom of the button, and there is SetFont() function to make it bold, but I don't know how to make it accept cyrillic characters ( code example would be greatly appreciated ).

As for icon + text part, this is what I have tried so far:

***********************************************************************************

UPDATE #1: posted entire code in hope for helping others finding a solution faster.

************************************************************************************

Resource.h
******************************************************
#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif

#define IDI_ICON1 100
*******************************************************

main.cpp
*******************************************************

#include "resource.h"
#include <windows.h>

static HINSTANCE hInst;

// icon for desktop, ALT +TAB ... ( this same icon shall be used temporally for testing button )

static HICON hIcon; 

// WinMain's procedure

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

	switch(msg)
	{

	case WM_CREATE:
		
		{
			HWND hbtnUnosPodataka = CreateWindowEx(0, "Button", "Geotermist", WS_VISIBLE | WS_CHILD |  BS_TEXT | BS_BOTTOM, 100, 100,150, 150, hwnd, (HMENU)4000, hInst, 0);

			HICON hIcon1 = LoadIcon( hInst, MAKEINTRESOURCE(IDI_ICON1));
			
			SendMessage( hbtnUnosPodataka , BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hIcon1);
		
		}
		break;

	case WM_CLOSE:

		DestroyWindow(hwnd);

		break;

	case WM_DESTROY:

		PostQuitMessage(0);

		break;

	default:
		return DefWindowProc(hwnd, msg, wParam, lParam);
	}
	return 0;
}

// WinMain

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, 
				   int nCmdShow)
{
	// store hInstance in global variable

	hInst = hInstance;
	
	// load main window's icon - this same icon shall be used for testing the button

	hIcon = LoadIcon( hInst, MAKEINTRESOURCE(IDI_ICON1));

	WNDCLASSEX wc;
	HWND hwnd;
	MSG Msg;

	wc.cbSize = sizeof(WNDCLASSEX);
	wc.style = 0;
	wc.lpfnWndProc = WndProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInstance;
	wc.hIcon = hIcon;
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); 
	wc.lpszMenuName = NULL;
	wc.lpszClassName = "Main_Window";
	wc.hIconSm = hIcon;

	if(!RegisterClassEx(&wc))
	{
		MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | 
			MB_OK);

		return 0;
	}

	// main window

	hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "Main_Window", "Geotermist",
		WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
		CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

	if(hwnd == NULL)
	{
		MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
		return 0;
	}

	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);

	while(GetMessage(&Msg, NULL, 0, 0) > 0)
	{
		TranslateMessage(&Msg);
		DispatchMessage(&Msg);
	}

	return Msg.wParam;
}


At MSDN, it is stated that in order for button to display icon and text BS_BITMAP or BS_ICON must not be set, and I should send BM_SETIMAGE.

I have tried that, but it failed.

I work in MS Visual Studio Express 2008, on Windows XP, in C++, using WIN32 API. If any other information is required ( source code or something similar ), please ask for it, I will more than gladly supply it.
Posted
Updated 10-May-13 6:53am
v2

The following code worked for me, using either an icon or a bitmap :
C++
HINSTANCE		hInstance = GetModuleHandle(NULL);
hButton = CreateWindowEx(0, L"Button", L"АБВГДЕЖЗ", WS_VISIBLE | WS_CHILD | BS_TEXT | BS_BOTTOM, 100, 100, 150, 150, hWnd, (HMENU)4000, hInstance, 0);

// use an icon
HICON hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDR_MAINFRAME));
SendMessage(hButton, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hIcon);

// or use a bitmap
HANDLE hBitmap = LoadImage(hInstance, MAKEINTRESOURCE(IDR_BUTTON), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
SendMessage(hButton, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBitmap);

I have not tried Cyrillic characters, but I would guess you just need to send them in the third parameter of the CreateWindowEx call, after setting a Cyrillic font.

[edit]
Cyrillic also works fine.
[/edit]
 
Share this answer
 
v3
Comments
MyOldAccount 10-May-13 12:27pm    
I have made adjustments according to your solution, but it does not work for me.

Can you post your entire code, or should I post mine ( it is not so big ), so we can see what is missing?

Thank you.
Richard MacCutchan 10-May-13 12:40pm    
That is my entire code in terms of displaying the button. It creates a button in the main window of a very basic Windows application. I did discover that the BS_BOTTOM style applies to the image that's painted on the button, rather than the text.

Maybe you should show what you have done. But please don't post it as a reply to this message; use the "Improve question" link above and add it in there.
MyOldAccount 10-May-13 12:54pm    
I did as you have told me.
Hope that this will help.
Thank you.
Richard MacCutchan 10-May-13 13:09pm    
Thank you, it allowed me to copy your code into VS and build it. And guess what, it works perfectly! However, that was using VS2010 in Windows 7; I shall give VS2008 a try, but probably not before tomorrow.

Can you try and explain in more detail exactly what happens when you do it.
MyOldAccount 10-May-13 13:13pm    
Thank you, yes I can explain.

It displays text normally, but there is no icon.

I suspect that it is Visual Studio's fault, since I am using free edition, and it does have some limitations, like resource editor being unavailable, so I have to use alternative one.

Perhaps this is just another part that Microsoft left out from free edition.
If you run into the problem in 2018 --> you simply need to enable visual style first!
Then the posted codes should be working.

Link:
Enabling Visual Styles | Microsoft Docs[^]
 
Share this answer
 
Comments
Avtem 17-Sep-22 1:12am    
Wow! i actually had a different problem: my icons were incredibly ugly if you disable the button. Enabling visual styles fixed that problem!

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900