3

最近、古いカスタム コントロールを置き換えて、アプリケーションで CMFCColorButtons を使い始めました。ここで、選択できる色を制限したいと思います。

そこで、「SetPalette」というメソッドを見つけました。OnInitDialog メソッド内で次のような CPalette を作成します。

// CArray<COLORREF, COLORREF> arrColors is an array of COLORREFS coming
// from my helper class
if (arrColors.GetCount() > 0)
{
    LOGPALETTE* pLogPalette = (LOGPALETTE*) new BYTE[sizeof(LOGPALETTE) + 
                              (arrColors.GetCount() * sizeof(PALETTEENTRY))];
    pLogPalette->palNumEntries = arrColors.GetCount();

    for (int i = 0; i < arrColors.GetCount(); i++)
    {
        COLORREF currentColor = arrColors.GetAt(i);
        pLogPalette->palPalEntry[i].peRed = GetRValue(currentColor);
        pLogPalette->palPalEntry[i].peGreen = GetGValue(currentColor);
        pLogPalette->palPalEntry[i].peBlue = GetBValue(currentColor);
    }

    m_pPalette = new CPalette();
    m_pPalette->CreatePalette(pLogPalette);
    delete []pLogPalette;
}

その後、コード内で CMFCColorButtons が作成され、OnInitDialog でも呼び出されるパレットが設定されます (このダイアログでは合計 6 つのカラー ボタン)。

void CMyColorPopUp::InitColorButton(CMFCColorButton* pColorButton, int iColor)
{
    pColorButton->SetPalette(m_pPalette);
    pColorButton->SetColor(iColor);
    pColorButton->SetColumnsNumber(8);
}

動作は期待どおりではありません。ボタンをクリックすると、カラー パレットがディスプレイ全体に広がり、エントリごとに 1 つの色しか表示されません (100 行と 8 列のように) ...

私の ColorButton の問題を解決できるかもしれませんが、Web で追加のヘルプが見つかりませんでした。前もって感謝します!

- クリス

4

1 に答える 1

1

わかりました、私は答えを見つけました。LOGPALETTE のシステム バージョンを設定するのを忘れていました。たった 1 行のコードです。

pLogPalette->palVersion = 0x300;
于 2012-04-26T17:44:49.373 に答える