Old 24th August 2022, 22:07   #1
Ingvar
Junior Member
 
Join Date: Aug 2022
Posts: 20
Skin support for plugin window controls

Hello! I am writing my own plugin. It creates own window. The resource dialog fits nicely into the new window. But here is the problem - all controls do not have a skin support:

Click image for larger version

Name:	waa.jpg
Views:	119
Size:	12.3 KB
ID:	55012

How to fix it?
Ingvar is offline   Reply With Quote
Old 25th August 2022, 15:24   #2
thinktink
Forum King
 
thinktink's Avatar
 
Join Date: May 2009
Location: No longer on the streets of Kings County, CA.
Posts: 3,219
I'm assuming you've already checked the source code for the example embedded window plugin here: http://forums.winamp.com/showthread.php?t=322114

If you can, post your source code in a zip or 7z archive so I can see if I can find any obvious errors.
thinktink is offline   Reply With Quote
Old 26th August 2022, 02:12   #3
Ingvar
Junior Member
 
Join Date: Aug 2022
Posts: 20
Quote:
Originally Posted by thinktink View Post
I'm assuming you've already checked the source code for the example embedded window plugin here
All given links in this thread to the webpage with the example window are no longer available, i.e. article deleted.

But all I could find was the need to handle messages of embedded dialog proc like this:

code:
case WM_CTLCOLORLISTBOX:
case WM_CTLCOLORDLG:
case WM_CTLCOLORBTN:
case WM_CTLCOLORSTATIC:
case WM_CTLCOLOREDIT:
case WM_DRAWITEM:
{
return WADlg_handleDialogMsgs(hwnd, msg, wParam, lParam);
}


Now it works correct. Is everything right here?



Another one offtopic question: I added the plugin menu item to Winamp main menu using InsertMenuItem() function with text and shortcut:
code:
wchar_t menu_caption[] = L"My plugin name\tAlt+B";


By handling WM_COMMAND I process menu click. And it works. But when I press Alt+B shortcut associated with menu item - nothing happens.

How to fix this?
Ingvar is offline   Reply With Quote
Old 26th August 2022, 20:22   #4
thinktink
Forum King
 
thinktink's Avatar
 
Join Date: May 2009
Location: No longer on the streets of Kings County, CA.
Posts: 3,219
I could have SWORN I downloaded that example plugin a long time ago but I still can't find it.

However, you can use the following for an example:
http://forums.winamp.com/showthread....83#post3215083
It should have everything you need to learn standard skinning support. It also contains an example for shortcut handling.

Unfortunately, there is no native skinning support for radio buttons and checkboxes.

Your edit box doesn't look right. Before going on a tare, check the example I provided for that.
thinktink is offline   Reply With Quote
Old 27th August 2022, 01:28   #5
Ingvar
Junior Member
 
Join Date: Aug 2022
Posts: 20
thinktink, thanks for example!

I have added this code:
code:
api_application *WASABI_API_APP;
api_service *WASABI_API_SVC;

template <class api_T>
void ServiceBuild(api_T *&api_t, GUID factoryGUID_t)
{
if(WASABI_API_SVC)
{
waServiceFactory *factory = WASABI_API_SVC->service_getServiceByGuid(factoryGUID_t);

if(factory)
{
api_t = (api_T*)factory->getInterface();
}
}
}



on init():
code:
WADlg_init(plugin.hwndParent);

WASABI_API_SVC = (api_service*)SendMessage(plugin.hwndParent, WM_WA_IPC, 0, IPC_GET_API_SERVICE);

if(WASABI_API_SVC != NULL)
{
ServiceBuild(WASABI_API_APP, applicationApiServiceGuid);
}



except WASABI_API_CREATEDIALOGW I still use: CreateDialogParam(...

code:
ACCEL accel = {FVIRTKEY | FALT, 'A', MY_PLUGINMENU_ID};
HACCEL hAccel = CreateAcceleratorTable(&accel, 1);
WASABI_API_APP->app_addAccelerators(embedWnd, &hAccel, 1, TRANSLATE_MODE_NORMAL);



code:
DlgProc:
case WM_COMMAND:
{
if(LOWORD(wParam) == MY_PLUGINMENU_ID)
{
MessageBox(hwnd, L"This is hotkey!", L"", MB_OK);
}

break;
}



But when I press Alt+A nothing happens. Hotkey not work. Maybe I something missed?
Ingvar is offline   Reply With Quote
Old 27th August 2022, 17:57   #6
thinktink
Forum King
 
thinktink's Avatar
 
Join Date: May 2009
Location: No longer on the streets of Kings County, CA.
Posts: 3,219
Quote:
Originally Posted by Ingvar View Post
thinktink, thanks for example!

I have added this code:
code:
api_application *WASABI_API_APP;
api_service *WASABI_API_SVC;

template <class api_T>
void ServiceBuild(api_T *&api_t, GUID factoryGUID_t)
{
if(WASABI_API_SVC)
{
waServiceFactory *factory = WASABI_API_SVC->service_getServiceByGuid(factoryGUID_t);

if(factory)
{
api_t = (api_T*)factory->getInterface();
}
}
}



on init():
code:
WADlg_init(plugin.hwndParent);

WASABI_API_SVC = (api_service*)SendMessage(plugin.hwndParent, WM_WA_IPC, 0, IPC_GET_API_SERVICE);

if(WASABI_API_SVC != NULL)
{
ServiceBuild(WASABI_API_APP, applicationApiServiceGuid);
}



except WASABI_API_CREATEDIALOGW I still use: CreateDialogParam(...

code:
ACCEL accel = {FVIRTKEY | FALT, 'A', MY_PLUGINMENU_ID};
HACCEL hAccel = CreateAcceleratorTable(&accel, 1);
WASABI_API_APP->app_addAccelerators(embedWnd, &hAccel, 1, TRANSLATE_MODE_NORMAL);



code:
DlgProc:
case WM_COMMAND:
{
if(LOWORD(wParam) == MY_PLUGINMENU_ID)
{
MessageBox(hwnd, L"This is hotkey!", L"", MB_OK);
}

break;
}



But when I press Alt+A nothing happens. Hotkey not work. Maybe I something missed?
How have you generated/set/defined "MY_PLUGINMENU_ID"?

I do it with:
code:
MY_PLUGINMENU_ID=(UINT)::SendMessage(plugin.hwndParent,WM_WA_IPC,(WPARAM)0,IPC_REGISTER_LOWORD_COMMAND);
thinktink is offline   Reply With Quote
Old 27th August 2022, 18:07   #7
thinktink
Forum King
 
thinktink's Avatar
 
Join Date: May 2009
Location: No longer on the streets of Kings County, CA.
Posts: 3,219
Quote:
Originally Posted by Ingvar View Post
...

code:
DlgProc:
case WM_COMMAND:
{
if(LOWORD(wParam) == MY_PLUGINMENU_ID)
{
MessageBox(hwnd, L"This is hotkey!", L"", MB_OK);
}

break;
}



But when I press Alt+A nothing happens. Hotkey not work. Maybe I something missed?
Have you subclassed the Winamp main HWND and checking WM_COMMAND/WM_SYSCOMMAND in there or are you checking inside your own embed wnd's DlgProc instead? If you can't subclass Winamp's main HWND then you can also check inside a Windows Hook (see SetWindowsHookEx in the MSDN for usage).
thinktink is offline   Reply With Quote
Old 27th August 2022, 17:33   #8
Ingvar
Junior Member
 
Join Date: Aug 2022
Posts: 20
Another one question: thinktink, your project compiled succesfully, but when I try to compile my project compiler throws error:
Quote:
error LNK2001: unresolved external symbol "class api_language * languageManager" (?languageManager@@3PAVapi_language@@A)
I add paths to Winamp SDK in PROJECT->my_project properties->VC++ Directories->Include Directories:
Quote:
D:\Winamp_SDK;D:\Winamp_SDK\Wasabi;D:\Winamp_SDK\Agave;$(IncludePath)
But compiler still error LNK2001: unresolved external symbol "class api_language * languageManager"
Ingvar is offline   Reply With Quote
Old 27th August 2022, 20:18   #9
thinktink
Forum King
 
thinktink's Avatar
 
Join Date: May 2009
Location: No longer on the streets of Kings County, CA.
Posts: 3,219
Quote:
Originally Posted by Ingvar View Post
Another one question: thinktink, your project compiled succesfully, but when I try to compile my project compiler throws error:

I add paths to Winamp SDK in PROJECT->my_project properties->VC++ Directories->Include Directories:

But compiler still error LNK2001: unresolved external symbol "class api_language * languageManager"
I'm not sure about your version of the compiler but I'm using the free Microsoft Visual C++ 2010 Express to build gen_classicart. If you're doing the same:

Open "gen_yourplugin" Property Pages

Select: All Configurations

Go to: Configuration Properties -> C/C++ -> General

Inspect "Additional Include Directories" and make sure the subfolders in the Winamp SDK folder labeled "Wasabi", "Agave", and "Winamp" are being included.

Attached Thumbnails
Click image for larger version

Name:	Additional Include Directories.PNG
Views:	387
Size:	9.1 KB
ID:	55027  
thinktink is offline   Reply With Quote
Old 5th September 2022, 21:11   #10
Ingvar
Junior Member
 
Join Date: Aug 2022
Posts: 20
Ok, so how do I get or calculate the text color for an inactive button?

For example, for a Bento skin the inactive text color should be: 91, 94, 95:
And for Winamp Modern Skin - 147, 149, 155

I checked all colors that WADlg_getColor() function returns. There is no such colors! Also I checked the contents of the skin bitmap (IPC_GET_GENSKINBITMAP). There is no such colors also.

It's like the text color for an inactive button is calculated by some formula.

I found the formula inside wa_dlg.h file:
PHP Code:
fg wadlg_colors[WADLG_WNDFG];
bg wadlg_colors[WADLG_WNDBG];
colour RGB((GetRValue(fg)+GetRValue(bg))/2, (GetGValue(fg)+GetGValue(bg))/2, (GetBValue(fg)+GetBValue(bg))/2); 
But this calculation gives wrong color. For example, for Bento:

fg = 210, 210, 210
bg = 51, 55, 56
colour = (210+51)/2, (210+55)/2, (210+56)/2 = 130, 132, 133

When DrawText() with this color, then we will see:



Similarly for Winamp Modern:

fg = 255, 255, 255
bg = 127, 135, 149
colour = (255+127)/2, (255+135)/2, (255+149)/2 = 191, 195, 202

When DrawText() with this color, then we will see:



As you can see, this is an incorrect calculation formula.

For example in JTF plugin inactive buttons has the correct text color.


So how do you calculate the correct color values for inactive text?
Ingvar is offline   Reply With Quote
Old 6th September 2022, 15:07   #11
thinktink
Forum King
 
thinktink's Avatar
 
Join Date: May 2009
Location: No longer on the streets of Kings County, CA.
Posts: 3,219
I'm working on an unauthorized update to the example plugin originally created by DrO with skinned controls and menus. It should answer a number of questions. Just need a little time.
thinktink is offline   Reply With Quote
Old 7th September 2022, 06:10   #12
thinktink
Forum King
 
thinktink's Avatar
 
Join Date: May 2009
Location: No longer on the streets of Kings County, CA.
Posts: 3,219


Hope this helps...
Attached Thumbnails
Click image for larger version

Name:	GenExample.png
Views:	340
Size:	6.4 KB
ID:	55053  
Attached Files
File Type: zip Nullsoft_Embedded_Window_Example_(Unauthorized)_v1_2.zip (156.0 KB, 134 views)
thinktink is offline   Reply With Quote
Old 10th September 2022, 01:46   #13
Ingvar
Junior Member
 
Join Date: Aug 2022
Posts: 20
Despite some errors in your code, the principle of skinning the controls is clear.

In short, in order to skin the controls, the developer needs to either draw them completely (owner drawing) or use a wrapper functions from wa_dlg.h, or request the API of the media library plugin to perform the skinning of the controls.

I also noticed that when using Media library API you must also use the WADlg_DrawChildWindowBorders() function for drawing borders, because Media library API does not draw it. It's strange that drawing borders is not part of skinning support of the Media library API.

To perform skinning of the edit control, I tried to use the media library API:

PHP Code:
//on WM_INITDIALOG
MLSKINWINDOW mlsw = {0};
mlsw.hwndToSkin GetDlgItem(hwndIDC_EDIT1);
mlsw.skinType SKINNEDWND_TYPE_EDIT;
mlsw.style SWS_USESKINCOLORS SWS_USESKINCURSORS SWS_USESKINFONT;
MLSkinWindow(ML_hWnd, &mlsw);

//on WM_PAINT draw borders (because ML API doesn't support it)
WADlg_DrawChildWindowBorders(...) 
And it works well except that it keeps using the default font and not the skin font.
As you can see the required bit SWS_USESKINFONT is set.



The only way to set the correct font for an edit control is to create a font and set it with WM_SETFONT for Edit control and not set SWS_USESKINFONT bit in mlsw.style.

I just don't understand why SWS_USESKINFONT bit doesn't work.
Ingvar is offline   Reply With Quote
Old 11th September 2022, 00:24   #14
thinktink
Forum King
 
thinktink's Avatar
 
Join Date: May 2009
Location: No longer on the streets of Kings County, CA.
Posts: 3,219
Quote:
Originally Posted by Ingvar View Post
Despite some errors in your code...
If you can, please mark the errors so that I can correct them.
thinktink is offline   Reply With Quote
Reply
Go Back   Winamp & Shoutcast Forums > Developer Center > Winamp Development

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump