Win32应用程序界面本地化问题
|
fanyard
2007-10-19
各位老大,我刚刚接触D语言没多久,DMD自带例子中有一个winsamp.d的程序,编译后能够正常运行,想让界面看起来跟XP一样,就创建了一个winsamp.exe.manifest文件,再次运行这个示例程序,按钮就不见了,各位前辈们能帮忙看看是什么问题么?
winsamp.exe.manifest如下 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity name="winsamp.exe" processorArchitecture="x86" version="5.1.0.0" type="win32"/> <description>Windows Shell</description> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> </assembly> |
|
|
ant-man
2007-10-19
摘自DFL,为了让wxD有本地的Feel and look
在所有UI构建之前调用
void main() {
enableVisualStyles() ;
.....
}
module Pigersing.aUI.abase ;
import tango.sys.win32.Types ;
import tango.sys.win32.UserGdi ;
// Should be called before creating any controls.
// This is typically the first function called in main().
// Does nothing if not supported.
static void enableVisualStyles() {
HMODULE kernel32;
kernel32 = GetModuleHandleA("kernel32.dll");
const char[] MANIFEST = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>` \r\n
`<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">` \r\n
`<description>DFL manifest</description>` \r\n
`<dependency>` \r\n
`<dependentAssembly>` \r\n
`<assemblyIdentity `
`type="win32" `
`name="Microsoft.Windows.Common-Controls" `
`version="6.0.0.0" `
`processorArchitecture="X86" `
`publicKeyToken="6595b64144ccf1df" `
`language="*" `
`/>` \r\n
`</dependentAssembly>` \r\n
`</dependency>` \r\n
`</assembly>` \r\n;
assert(kernel32);
{
CreateActCtxWProc createActCtxW;
createActCtxW = cast(CreateActCtxWProc)GetProcAddress(kernel32, "CreateActCtxW");
if (createActCtxW) {
GetTempPathWProc getTempPathW;
GetTempFileNameWProc getTempFileNameW;
ActivateActCtxProc activateActCtx;
getTempPathW = cast(GetTempPathWProc)GetProcAddress(kernel32, "GetTempPathW");
assert(getTempPathW !is null);
getTempFileNameW = cast(GetTempFileNameWProc)GetProcAddress(kernel32, "GetTempFileNameW");
assert(getTempFileNameW !is null);
activateActCtx = cast(ActivateActCtxProc)GetProcAddress(kernel32, "ActivateActCtx");
assert(activateActCtx !is null);
DWORD pathlen;
wchar[MAX_PATH] pathbuf = void;
//if(pathbuf)
{
pathlen = getTempPathW(pathbuf.length, pathbuf.ptr);
if (pathlen) {
DWORD manifestlen;
wchar[MAX_PATH] manifestbuf = void;
//if(manifestbuf)
{
manifestlen = getTempFileNameW(pathbuf.ptr, "dmf", 0, manifestbuf.ptr);
if (manifestlen) {
HANDLE hf;
hf = CreateFileW(manifestbuf.ptr, GENERIC_WRITE, 0, null, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, HANDLE.init);
if (hf != INVALID_HANDLE_VALUE) {
DWORD written;
if (WriteFile(hf, MANIFEST.ptr, MANIFEST.length, &written, null)) {
CloseHandle(hf);
ACTCTXW ac;
HANDLE hac;
ac.cbSize = ACTCTXW.sizeof;
ac.dwFlags = 0;
ac.lpSource = manifestbuf.ptr;
hac = createActCtxW(&ac);
if (hac != INVALID_HANDLE_VALUE) {
ULONG_PTR ul;
activateActCtx(hac, &ul);
_initCommonControls(ICC_STANDARD_CLASSES); // ?
} else {
debug(APP_PRINT)
printf("CreateActCtxW failed.\n");
}
} else {
CloseHandle(hf);
}
}
DeleteFileW(manifestbuf.ptr);
}
}
}
}
}
}
}
// For this to work properly on Windows 95, Internet Explorer 4.0 must be installed.
private void _initCommonControls(DWORD dwControls) {
version(SUPPORTS_COMMON_CONTROLS_EX) {
pragma(msg, "DFL: extended common controls supported at compile time");
alias InitCommonControlsEx initProc;
}
else {
// Make sure InitCommonControlsEx() is in comctl32.dll,
// otherwise use the old InitCommonControls().
HMODULE hmodCommonControls;
InitCommonControlsExProc initProc;
hmodCommonControls = LoadLibraryA("comctl32.dll");
if (!hmodCommonControls)
// throw new DflException("Unable to load 'comctl32.dll'");
goto no_comctl32;
initProc = cast(InitCommonControlsExProc)GetProcAddress(hmodCommonControls, "InitCommonControlsEx");
if (!initProc) {
//FreeLibrary(hmodCommonControls);
no_comctl32:
InitCommonControls();
return;
}
}
INITCOMMONCONTROLSEX icce;
icce.dwSize = INITCOMMONCONTROLSEX.sizeof;
icce.dwICC = dwControls;
initProc(&icce);
}
private extern(Windows) {
alias UINT function(LPCWSTR lpPathName, LPCWSTR lpPrefixString, UINT uUnique, LPWSTR lpTempFileName) GetTempFileNameWProc;
alias DWORD function(DWORD nBufferLength, LPWSTR lpBuffer) GetTempPathWProc;
alias HANDLE function(PACTCTXW pActCtx) CreateActCtxWProc;
alias BOOL function(HANDLE hActCtx, ULONG_PTR* lpCookie) ActivateActCtxProc;
alias BOOL function(LPINITCOMMONCONTROLSEX lpInitCtrls) InitCommonControlsExProc;
}
private struct INITCOMMONCONTROLSEX {
DWORD dwSize;
DWORD dwICC;
}
alias INITCOMMONCONTROLSEX* LPINITCOMMONCONTROLSEX ;
private struct ACTCTXW {
ULONG cbSize;
DWORD dwFlags;
LPCWSTR lpSource;
USHORT wProcessorArchitecture;
LANGID wLangId;
LPCWSTR lpAssemblyDirectory;
LPCWSTR lpResourceName;
LPCWSTR lpApplicationName;
HMODULE hModule;
}
alias ACTCTXW* PACTCTXW;
private const ICC_STANDARD_CLASSES = 0x00004000 ;
|
|
|
fanyard
2007-10-24
谢谢,我研究一下。
|

