2011-04-14 2 views
28

나는 C와 WinAPI에서 C++이나 C#을 사용하지 않고 엄격하게 프로그래밍하고있다. 저는 초보자이며 콘트롤러를 그리는 법을 배웁니다. Windows 나 Command Button과 같은 다른 컨트롤을 만들면 Windows Native 모양이됩니다. 이것 좀보세요 : C + Win API 프로그래밍 : Windows 7에서 컨트롤을 찾는 방법?

This is look I am getting!

그러나 Windows 7의

는, 명령 단추는 다음과 같이 :

enter image description here 지금

, 어떻게 같이 내 프로그램에 명령 단추를받을 수 있나요 그. 심지어 가능할까요? 참조 용으로이 자습서를 따르고 있습니다. http://zetcode.com/gui/winapi/

감사합니다.

답변

17

XML 매니페스트를 별도의 파일 또는 포함 리소스로 제공하여 앱의 비주얼 스타일을 사용하도록 설정할 수 있습니다. 자세한 내용은 Enabling Visual Styles을 참조하십시오.

+0

덕분에 빠른 응답을위한 많은! 자, 내 애플 리케이션은 내가 원하는 것처럼 정확하게 찾고있다. –

22

테마 (시각적 스타일)가 발명되기 전에 컨트롤이 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 

This MSDN article 당신이 원하는 그 어느 것보다 시각적 스타일에 대한 자세한 정보가 있습니다.


응용 프로그램을 실제로 보이게하려면 기본 창에 사용되는 배경 브러시를 변경해야합니다. 기본적으로 텍스트 상자의 배경 (흰색)과 같은 색을 사용하도록 설정되어 있습니다.

대신 3D 컨트롤을 페인트하는 데 사용되는 색상을 사용하고 싶습니다. 여기에 그림과 같이 WNDCLASS (또는 WNDCLASSEX) 구조의 hbrBackground 멤버 수정 :

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

을 왜 하나를 추가해야합니까? 이전 버전과의 호환성을 위해 다시. 세부 사항은 지루합니다. :-)

+0

답변 해 주셔서 감사합니다! :) 나는 stdafx.h를 포함하지 않기 때문에, 나는 단지 manifest를 통해 갔다. 색상에 대한 귀하의 조언은 정말 도움이되었습니다! 그냥 배경의 흰색 색상을 고정! –

+2

@Ishan : 원하는 코드를 어디에 든 넣을 수 있습니다. 'stdafx.h'는 기본 템플릿에 포함되어 있기 때문에 제안에 불과합니다. 미리 컴파일 된 헤더에 사용되며, 향후 사소한 응용 프로그램을 만들 경우 익숙해지기를 원할 것입니다. 그리고이 코드는 컴파일러에게 자동으로 매니페스트를 만들고 삽입하도록 지시합니다. 그 모든 것이 그 매니페스트에 관한 것입니다. 당신이 그것을 알아낼 수 있었기 때문에 다행! –

+0

나는 그것을 몰랐다! 감사. –

14

Windows XP가 새롭고 멋진 모습으로 바뀌었을 때를 기억하고 Windows 95/2000 클래식 모양으로 다시 되돌릴 수도 있고 색상 테마를 바꿀 수도 있습니다. 그것은 visual styles이라고 불 렸으며, Windows에 더 나은 테마 지원을 제공했습니다. 그 이후

Classic, Luna, Aero and Metro

비주얼 스타일 remained as a feature. Windows Vista 및 7에서는 Aero가 도입되었지만 여전히 고전 테마를 사용할 수있었습니다.Windows 8은 Aero 및 고전 테마를 모두 제거하고 Metro 테마를 추가했습니다. 고 대비 테마는 이제 시각적 스타일의 일부이며 더 이상 고전적인 모양을 갖지 않습니다.

따라서 Aero 스타일이 필요할 것으로 예상되는 Windows 7의 고전적인 테마 응용 프로그램은 응용 프로그램의 시각적 스타일 문제입니다. 이유를 모르겠지만 Microsoft는 API를 새로운 모습으로 마이그레이션하는 동안 이전 클래식 테마를 선택 사항으로 남겨 두지 않았습니다.

그래서 어떻게 현대적인 스타일을 적용 할 수 있습니까?

enter image description here

어느 쪽이든 this MSDN article는 응용 프로그램의 시각적 스타일을 사용하는 방법을 설명합니다. 사람들이 유니 코드 (정의 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는 리소스 파일에 포함해야하는 것을 잊지 마세요. 내가 몇 가지 예에 놓친이 단계를 본 적이

, 그리고 특정 운영 체제 버전 및 특정 아래에 몇 가지 이상한 행동을 일으킬 수 있습니다 : 당신은 또한 this MinGW guide에 따라, 당신의 WinMain에서 공용 컨트롤 DLL을 초기화 할 수 있습니다 단추가 보이지 않는 것과 같은 조건 또는 대화 상자가 작성되지 않는 경우.

INITCOMMONCONTROLSEX icc; 
icc.dwSize = sizeof(icc); 
icc.dwICC = ICC_WIN95_CLASSES; 
InitCommonControlsEx(&icc); 
관련 문제