ページ 11

レバーコントロールの作成についてお尋ねします

Posted: 2010年11月17日(水) 12:26
by taketoshi
こんにちは、お世話になります。

レバーコントロールを実装したいのですが、うまく表示されません。
しかし、何故かボーダーラインは表示されます。
下記ページのサンプルソース等を丸々流用しても同等の症状になってしまいます。
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:レバーコントロールの作成についてお尋ねします

Posted: 2010年11月17日(水) 13:47
by toyo
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++のプロパティで画像のように追加マニフェストを指定します
以上で表示されませんか

Re:レバーコントロールの作成についてお尋ねします

Posted: 2010年11月17日(水) 14:48
by toyo
別の解決法がありました
こちらの方が簡単です

#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:レバーコントロールの作成についてお尋ねします

Posted: 2010年11月17日(水) 15:56
by taketoshi
>toyoさん

ご返事ありがとうございます。
教えていただいた点を実行してみましたが上手くいきませんでした。

一つ目のマニフェスト埋め込みについては下記のエラーが出てしまいました。
1>マニフェストを埋め込んでいます...
1>.\Debug\tesk.exe.manifest : general error c1010070: Failed to load and parse the manifest.