こんにちは、お世話になります。
レバーコントロールを実装したいのですが、うまく表示されません。
しかし、何故かボーダーラインは表示されます。
下記ページのサンプルソース等を丸々流用しても同等の症状になってしまいます。
http://hp.vector.co.jp/authors/VA016117/coolbar.html
原因は何なのか、どなたがご指導お願いします。
//レバーコントロール作成関数
HWND CreateRebar(HWND hWnd)
{
HWND hRebar;
REBARINFO rbi;
//レバーコントロール作成
hRebar = CreateWindowEx(WS_EX_TOOLWINDOW,REBARCLASSNAME,NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | RBS_BANDBORDERS |
WS_CLIPCHILDREN | CCS_NODIVIDER|WS_BORDER,
0,0,0,0,hWnd,(HMENU)ID_Rebar,hInstance,NULL);
if(!hRebar)
{
MessageBox(hWnd,"error","error",MB_OK);
return NULL;
}
memset(&rbi,0,sizeof(REBARINFO));
rbi.cbSize = sizeof(REBARINFO);
SendMessage(hRebar,RB_SETBARINFO,0,(LPARAM)&rbi);
return hRebar;
}
//レバーコントロールの上に乗せるボタン作成関数
HWND CreateButton(HWND hRebar)
{
HWND hButton;
hButton = CreateWindow("BUTTON","on",WS_VISIBLE|WS_CHILD,
0,0,0,0,hRebar,(HMENU)ID_Button,hInstance,NULL);
return hButton;
}
//レバーコントロールに結合する関数
void RebarBand(HWND hRebar,HWND hButton)
{
REBARBANDINFO rBand;
memset(&rBand,0,sizeof(REBARBANDINFO));
rBand.cbSize = sizeof(REBARBANDINFO);
rBand.fMask = RBBIM_TEXT | RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE;
rBand.fStyle = RBBS_CHILDEDGE;
rBand.cxMinChild = 0;
rBand.cyMinChild = 30;
rBand.lpText = "BUTTON";
rBand.hwndChild = hButton;
rBand.cx = 200;
SendMessage(hRebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rBand);
}
以下ウインドプロシージャ
static HWND hRebar,hButton;
INITCOMMONCONTROLSEX icex;
switch(msg)
{
case WM_CREATE:
{
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_COOL_CLASSES;
InitCommonControlsEx(&icex);
hRebar = CreateRebar(hWnd);
hButton = CreateButton(hRebar);
RebarBand(hRebar,hButton);
break;
}
case WM_SIZE:
{
SendMessage(hRebar,WM_SIZE,wParam,lParam);
break;
}
プロジェクトにComCtl32.libを参加させてcommctrl.hはインクルードしております。
これで一週間悩んでおります。よろしくお願いします。
レバーコントロールの作成についてお尋ねします
Re:レバーコントロールの作成についてお尋ねします
UTF-8で以下のファイルを作ります(日本語書かなければ普通のエディタでOK)
ファイル名は
アプリ名.exe.manifest
でDebugフォルダとReleaseフォルダにコピーしておきます
ここから------------------------
<?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="X86"
name="CompanyName.ProductName.YourApp"
type="win32"
/>
<description>アプリケーションの説明</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
---------------------------ここまで
次にVisualC++のプロパティで画像のように追加マニフェストを指定します
以上で表示されませんか
ファイル名は
アプリ名.exe.manifest
でDebugフォルダとReleaseフォルダにコピーしておきます
ここから------------------------
<?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="X86"
name="CompanyName.ProductName.YourApp"
type="win32"
/>
<description>アプリケーションの説明</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
---------------------------ここまで
次にVisualC++のプロパティで画像のように追加マニフェストを指定します
以上で表示されませんか
Re:レバーコントロールの作成についてお尋ねします
別の解決法がありました
こちらの方が簡単です
#define _WIN32_WINNT 0x0501
をプログラムの先頭に追加するだけです
_WIN32_WINNTが0x0600以上になるとREBARBANDINFO構造体の内容が変わるのでその辺に原因がありそうです
http://gurigumi.s349.xrea.com/programmi ... eber1.html
こちらの方が簡単です
#define _WIN32_WINNT 0x0501
をプログラムの先頭に追加するだけです
_WIN32_WINNTが0x0600以上になるとREBARBANDINFO構造体の内容が変わるのでその辺に原因がありそうです
typedef struct tagREBARBANDINFOW { UINT cbSize; UINT fMask; UINT fStyle; COLORREF clrFore; COLORREF clrBack; LPWSTR lpText; UINT cch; int iImage; HWND hwndChild; UINT cxMinChild; UINT cyMinChild; UINT cx; HBITMAP hbmBack; UINT wID; #if (_WIN32_IE >= 0x0400) UINT cyChild; UINT cyMaxChild; UINT cyIntegral; UINT cxIdeal; LPARAM lParam; UINT cxHeader; #endif #if (_WIN32_WINNT >= 0x0600) RECT rcChevronLocation; // the rect is in client co-ord wrt hwndChild UINT uChevronState; // STATE_SYSTEM_* #endif } REBARBANDINFOW, *LPREBARBANDINFOW;参考URL追加しました
http://gurigumi.s349.xrea.com/programmi ... eber1.html

Re:レバーコントロールの作成についてお尋ねします
>toyoさん
ご返事ありがとうございます。
教えていただいた点を実行してみましたが上手くいきませんでした。
一つ目のマニフェスト埋め込みについては下記のエラーが出てしまいました。
1>マニフェストを埋め込んでいます...
1>.\Debug\tesk.exe.manifest : general error c1010070: Failed to load and parse the manifest.
ご返事ありがとうございます。
教えていただいた点を実行してみましたが上手くいきませんでした。
一つ目のマニフェスト埋め込みについては下記のエラーが出てしまいました。
1>マニフェストを埋め込んでいます...
1>.\Debug\tesk.exe.manifest : general error c1010070: Failed to load and parse the manifest.