programing

프로그래밍 In C + Win API: Windows 7(윈도우 7)에서 컨트롤을 찾도록 하는 방법은 무엇입니까?

css3 2023. 10. 12. 23:25

프로그래밍 In C + Win API: Windows 7(윈도우 7)에서 컨트롤을 찾도록 하는 방법은 무엇입니까?

저는 C++나 C#이 아닌 C와 WinAPI를 엄격히 프로그래밍하고 있습니다.저는 초보자이고 컨트롤 등을 그리는 법을 배우고 있습니다.이 문제는 제가 윈도우나 명령 버튼과 같은 다른 컨트롤을 만들 때 윈도우 네이티브 모양을 갖게 된다는 것입니다.이것을 보십시오.

This is look I am getting!

그러나 Windows 7(윈도우 7)의 명령 버튼은 다음과 같습니다.

enter image description here

이제 어떻게 하면 제 프로그램에서 명령 버튼을 그렇게 만들 수 있을까요?그게 가능하긴 해요?참고로 http://zetcode.com/gui/winapi/ 이 자습서를 따르고 있습니다.

감사해요.

컨트롤은 테마(시각적 스타일)가 개발되기 전인 1990년대를 이렇게 돌아봤습니다.여러분이 알아차리셨듯이, 현대적인 단추들은 이제 모든 화려한 바지들에 그라디언트와 욱신거리는 그런 것들로 칠해져 있습니다.그러나 하위 호환성의 이유로 컨트롤에서 해당 치료를 받도록 특별히 요청해야 합니다. 그렇지 않으면 기존 스타일로 되돌아갑니다.

매니페스트를 지정하면 됩니다.응용프로그램의 루트 디렉터리에 일반 텍스트 형식으로 하나를 추가하거나 Visual Studio(2005년 이후)에서 EXE에 하나를 자동으로 내장하도록 할 수 있습니다.

두 번째 길은 제가 가는 길입니다.당신의 코드에 다음 코드를 추가합니다.stdafx.h프로젝트를 구축할 때 매니페스트를 자동으로 추가할 것을 컴파일러에게 알리는 파일:

#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif

이 MSDN 기사는 시각적 스타일에 대한 정보가 당신이 원하는 것보다 더 많습니다.


응용프로그램을 네이티브로 보이려면 기본 창에 사용되는 배경 브러시를 변경해야 합니다.기본적으로 텍스트 상자의 배경(흰색)과 동일한 색을 사용하도록 설정됩니다.

대신 3D 컨트롤을 칠하는 데 사용되는 색상을 사용하려고 합니다.수정합니다.hbrBackground당신의 멤버WNDCLASS(또는WNDCLASSEX) 구조는 다음과 같습니다.

wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);

왜 1개를 추가해야 합니까?역호환성의 이유로, 다시.디테일이 지루하네요 :-)

XML 매니페스트를 별도의 파일로 제공하거나 내장된 리소스로 제공하여 앱의 시각적 스타일을 활성화할 수 있습니다.자세한 내용은 시각적 스타일 사용을 참조하십시오.

Windows XP(윈도우 XP)가 새로운 모습으로 출시되었을 때를 기억할 수 있으며 Windows 95/2000의 고전적인 모습으로 되돌리거나 색상 테마를 변경할 수도 있습니다.그것은 시각적 스타일이라고 불렸고, 이것은 윈도우에 더 나은 테마 지원을 가져다 주었습니다.

Classic, Luna, Aero and Metro

비주얼 스타일은 그 이후에도 특징으로 남아있었습니다.윈도우 비스타와 7은 에어로를 도입했지만 여전히 고전적인 테마를 사용할 수 있도록 했습니다.윈도우 8은 에어로와 클래식 테마를 모두 제거하고 메트로 테마를 추가했습니다.고대비 테마는 이제 시각적 스타일의 일부가 되어 더 이상 고전적인 모습을 띠지 않습니다.

따라서 Aero 스타일이 예상되었던 Windows 7의 고전적인 테마 애플리케이션은 애플리케이션의 시각적 스타일에 문제가 됩니다.왜 그런지는 모르겠지만 마이크로소프트는 API를 새 모양으로 마이그레이션하면서 기존의 고전 테마를 선택 사항으로 두지 않았습니다.

그럼 현대적인 스타일은 어떻게 적용해야 할까요?

enter image description here

어느 쪽이든 이 MSDN 문서에서는 응용프로그램의 시각적 스타일을 활성화하는 방법을 설명합니다.유니코드를 활성화한다는 말을 본 적이 있습니다.UNICODE)이 가능하지만 필수는 아닙니다.기본적으로 공통 컨트롤 DLL의 버전 6을 요구 사항으로 지정하는 매니페스트 파일을 작성한 다음 리소스 또는 아래의 플레이스로 내장하면 됩니다.appname.exe.manifest실행 파일의 디렉토리에 저장됩니다.샘플 매니페스트는 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity version="1.0.0.0" processorArchitecture="*"
        name="CompanyName.ProductName.YourApplication" type="win32"/>
    <description>Your application description here.</description>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0" type="win32" processorArchitecture="*"
                publicKeyToken="6595b64144ccf1df" language="*"/>
        </dependentAssembly>
    </dependency>
</assembly>

한다면, 를 .winuser.h리소스 파일에 포함됩니다.롤 다에서 공통 .WinMain, 이 MinGW 가이드에 따르면:

일부 예제에서는 이 단계가 누락된 것을 보았는데, 특정 운영 체제 버전 및 특정 조건에서 버튼이 보이지 않거나 대화 상자가 생성되지 않는 등 이상한 동작이 발생할 수 있습니다.

INITCOMMONCONTROLSEX icc;
icc.dwSize = sizeof(icc);
icc.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&icc);

언급URL : https://stackoverflow.com/questions/5663091/programming-in-c-win-api-how-to-get-windows-7-look-for-controls