-
January 3rd, 2014, 04:46 AM
#1
[win32] - transparent and opacy
i build these function from VB6(programming language):
Code:
void Transparent()
{
long test=GetWindowLong(hwnd, GWL_EXSTYLE);
SetWindowLong( hwnd, GWL_EXSTYLE,test | WS_EX_LAYERED);
SetLayeredWindowAttributes (hwnd, clrBackColor, 0, LWA_COLORKEY);
const char *text;
text=to_string( GetLastError()).c_str();
MessageBox(NULL,text,"erro",MB_OK);
}
but i get an error from messagebox:
87:ERROR_INVALID_PARAMETER - The parameter is incorrect.
(these code is for hide the backcolor)
can anyone advice me?
-
January 3rd, 2014, 06:19 AM
#2
Re: [win32] - transparent and opacy
Are you compiling as ASCII or UNICODE?
All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!
C++23 Compiler: Microsoft VS2022 (17.6.5)
-
January 3rd, 2014, 06:23 AM
#3
Re: [win32] - transparent and opacy
Originally Posted by 2kaud
Are you compiling as ASCII or UNICODE?
sorry i don't know answer to that question... i'm using the Code Blocks IDE.
VictorN: yes... theres no error, on compiling, but no results on running. that's why i used the GetLastError()
-
January 3rd, 2014, 06:20 AM
#4
Re: [win32] - transparent and opacy
You should not call GetLastError unless the API function (SetLayeredWindowAttributes in your case) has failed.
Victor Nijegorodov
-
January 3rd, 2014, 06:59 AM
#5
Re: [win32] - transparent and opacy
MessageBox takes 4 parameters, The second and third parameters are typed as LPCTSTR. If you are compiling as UNICODE, then these become LPCWSTR which is const WCHAR* which is const wchar_t*. If you are compiling as ASCII, LPCTSTR becomes LPCSTR which is const char*. As text is defined as const char *, this is ASCII. If you are compiling as UNICODE, then MessageBox would be expecting a type of const wchar_t* and not const char* which is being provided - which could be the reason for the error 87. Try changing MessageBox to MessageBoxA().
Victor is quite right. The value returned by GetLastError() is only valid when an error has actually occured and the function in error states that the error number can be obtained by calling this function. Calling GetLastError() in a context in which it is not expected to be called can provide erronous information. SetLayeredWindowAttributes() returns 0 on failure and only in that case should GetLastError() be used.
All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!
C++23 Compiler: Microsoft VS2022 (17.6.5)
-
January 3rd, 2014, 07:37 AM
#6
Re: [win32] - transparent and opacy
Originally Posted by 2kaud
MessageBox takes 4 parameters, The second and third parameters are typed as LPCTSTR. If you are compiling as UNICODE, then these become LPCWSTR which is const WCHAR* which is const wchar_t*. If you are compiling as ASCII, LPCTSTR becomes LPCSTR which is const char*. As text is defined as const char *, this is ASCII. If you are compiling as UNICODE, then MessageBox would be expecting a type of const wchar_t* and not const char* which is being provided - which could be the reason for the error 87. Try changing MessageBox to MessageBoxA().
Victor is quite right. The value returned by GetLastError() is only valid when an error has actually occured and the function in error states that the error number can be obtained by calling this function. Calling GetLastError() in a context in which it is not expected to be called can provide erronous information. SetLayeredWindowAttributes() returns 0 on failure and only in that case should GetLastError() be used.
i change for MessageBoxA() and i get the same error message.
1 question: SetLayeredWindowAttributes() is only for main window and not child window?
now i tested the same code with main window and works fine.. so what is needed for work with child windows?
-
January 3rd, 2014, 07:58 AM
#7
-
January 3rd, 2014, 12:00 PM
#8
Re: [win32] - transparent and opacy
Last edited by 2kaud; January 3rd, 2014 at 12:10 PM.
All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!
C++23 Compiler: Microsoft VS2022 (17.6.5)
-
January 3rd, 2014, 12:13 PM
#9
Re: [win32] - transparent and opacy
Originally Posted by 2kaud
i'm trying learn how use Regions, but i have 2 questions:
1 - i belive that i can do it pixel by pixel. but i'm confused... but i think that i can do it... at least i did with VB2010;
2 - with Regions, can i do opacy?
-
January 3rd, 2014, 01:06 PM
#10
Re: [win32] - transparent and opacy
from here: http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
i read:
"With WS_EX_COMPOSITED set, all descendants of a window get bottom-to-top painting order using double-buffering. Bottom-to-top painting order allows a descendent window to have translucency (alpha) and transparency (color-key) effects, but only if the descendent window also has the WS_EX_TRANSPARENT bit set. Double-buffering allows the window and its descendents to be painted without flicker."
but i'm confused
i think that, when i create the main window, i must add the WS_EX_TRANSPARENT extended style and add the WS_EX_COMPOSITED with child window extended style.
but or i don't understand what these means or i did something wrong
because the STATIC control isn't created
-
January 3rd, 2014, 03:04 PM
#11
Re: [win32] - transparent and opacy
All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!
C++23 Compiler: Microsoft VS2022 (17.6.5)
-
January 3rd, 2014, 03:21 PM
#12
Re: [win32] - transparent and opacy
With my test code (as posted previously), setting the main window as WS_EX_COMPOSITED and setting the static control WS_EX_TRANSPARENT has no effect as expected (non Windows 8 computer). I still get the static control created as if these styles weren't specified.
All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!
C++23 Compiler: Microsoft VS2022 (17.6.5)
-
January 3rd, 2014, 04:23 PM
#13
Re: [win32] - transparent and opacy
finally i found 1 solution(doublebuffering for avoid flickers and others):
(these code is in my label window procedure)
Code:
case WM_ERASEBKGND:
{
HDC mdc = CreateCompatibleDC(NULL);//creating the doublebuffer
Size a=inst->GetSize();//get the control size
Position b=inst->GetPosition();//get ocntrol position
HBITMAP mbmp = CreateBitmap(a.Width,a.Height,1,24,NULL); //create the bimap with a size
HBITMAP moldbmp = (HBITMAP)SelectObject(mdc,mbmp);//select the DC from that bitmap
HDC labeldc=GetDC(inst->hwnd);//get the label DC
BitBlt(mdc,0,0,a.Width,a.Height,GetDC(GetParent(inst->hwnd)),b.X, b.Y,SRCCOPY);//copy the parent control
TransparentBlt(mdc,0,0,a.Width,a.Height,labeldc,0,0,a.Width,a.Height,(UINT)inst->clrBackColor);//copy the label DC to mdc(double buffer), without backcolor
BitBlt(GetDC(inst->hwnd),0,0,a.Width,a.Height,mdc,b.X, b.Y,SRCCOPY);//now copy the double buffer to label dc
//clean objects
SelectObject(mdc,moldbmp);
DeleteObject(mbmp);
DeleteDC(mdc);
}
but i get these strange error on TransparenBlt():
"obj\Debug\main.o||In function `ZN5label7WndProcEP6HWND__jjl@16':"
"undefined reference to `_imp__TransparentBlt@44'"
the clrBackColor it's a COLORREF type.
isn't the 1st time that i get these strange error, can you please give me more information?
-
January 3rd, 2014, 04:40 PM
#14
Re: [win32] - transparent and opacy
Originally Posted by Cambalinho
finally i found 1 solution(doublebuffering for avoid flickers and others):
(these code is in my label window procedure)
...
but i get these strange error on TransparenBlt():
...
It means you did NOT find a solution yet!
Originally Posted by Cambalinho
get these strange error on TransparenBlt():
"obj\Debug\main.o||In function `ZN5label7WndProcEP6HWND__jjl@16':"
"undefined reference to `_imp__TransparentBlt@44'"
the clrBackColor it's a COLORREF type.
isn't the 1st time that i get these strange error, can you please give me more information?
It is a Linker error. Some .lib or .obj file containing TransparenBlt was not included (nor added) in your project.
Didn't you read the MSDN documentation about TransparenBlt ?
Didn't you add the Msimg32.lib library?
Victor Nijegorodov
-
January 3rd, 2014, 04:58 PM
#15
Re: [win32] - transparent and opacy
Originally Posted by VictorN
It means you did NOT find a solution yet!
It is a Linker error. Some .lib or .obj file containing TransparenBlt was not included (nor added) in your project.
Didn't you read the MSDN documentation about TransparenBlt ?
Didn't you add the Msimg32.lib library?
you have right... i never thot that... thanks
and yes the code seems not working
maybe i will do it in other time
Last edited by Cambalinho; January 3rd, 2014 at 05:09 PM.
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|