none
Cpenコンストラクタを使う上での必要なリソースとは何ですか? RRS feed

  • 質問

  • visual studio 2008 VC++(MFCダイアログベースをやっています)
             //UINT lbStyle COLORREF lbColor LONG lbHatch;
    const LOGBRUSH  LogBrush_for_BtnPush= {BS_SOLID, DIB_RGB_COLORS,  HS_CROSS}; //BS_SOLIDなのでlbHatchは無視される。
    const DWORD Ptrn[2] = { 2, 2};

    という定義を関数外(*.cppの先頭)したうえで、

    void CTest::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
    //前略
      CPen DrawPen(PS_COSMETIC | PS_ALTERNATE | PS_USERSTYLE, 1, &LogBrush_for_BtnPush, 2, Ptrn );
      pDC->SelectObject(DrawPen);

    //中略
      DrawPen.DeleteObject();

    }

    というソースコードを実行すると、CPen DrawPen・・・・のところで、エラーを知らせるメッセージボックスが出てきて、そこには
    「必要なリソースを利用できませんでした。」
    と書いてあります。
    試しに、LogBrush_for_BtnPushの宣言を
    const LOGBRUSH  LogBrush_for_BtnPush= {BS_SOLID, RGB(183, 91, 0), HS_CROSS}; //BS_SOLIDなのでlbHatchは無視される。
    と変えてやってみましたが、ビルドエラーは出ないものの、「必要なリソースを利用できませんでした。」であることに変わりはありませんでした。
    ここでいう「必要なリソース」とは何を言っているのでしょうか?

    この関数は、コマンドボタンのオーナードローで使っており、対象のコマンドボタンが押されたときにこの関数が呼ばれます。したがって、ボタンを押さない限りプログラムは呼ばれません。このボタンを押さない限り、いかなるエラーも出ずに使えていますので、メモリ不足などの理由であるとは考えづらいと思います。

    2010年11月11日 1:41

回答

  • 解決したのですか?解決したのなら、ほかの人が同じような問題に直面して、検索してきたときに嘆かないようにその解決策も記載しておくことをお勧めします。

    さて、エラーの原因ですが

    「CPen のコンストラクタ(またはCPen::CreatePen)にBRUSHを渡すものは、内部でExtCreatePen を呼び出していて、そのパラメータに排他になるべきものが両方とも指定されていたから」

    です。

    最初のパラメータとして渡している

    PS_COSMETIC | PS_ALTERNATE | PS_USERSTYLE

    のうち、PS_ALTERNATE | PS_USERSTYLE の部分はどちらかしか指定できません。UserStyleを必要とするのなら、PS_ALTERNATE を指定しなければ解決します。

    それと、BRUSHを初期化している部分ですが、2個目は、色(DIB_RGB_COLORSは色ではありません)を指定します。3つ目は、PS_SOLID の場合は、参照されないので、何も記述しないか、0を指定しておくのが良いのでは?と思います。

    詳しくは、ExtCreatePen API のリファレンスを参照してください(MFCのCPenではなく)。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    • 回答としてマーク AnalogTerebi 2010年11月11日 11:35
    2010年11月11日 4:21
  • びーしむさん、ありがとうございます。

    やってはみたのですが、「現在の場所のソースコードを表示できません」と出てしまい、逆アセンブル結果しか見ることができませんでした。

    自己解決しました。 済みません。
    • 回答としてマーク AnalogTerebi 2010年11月11日 4:05
    2010年11月11日 3:52

すべての返信

  • ステップイン(F11)実行して1行ずつ確認しながらデバッグすれば、メッセージボックスがでる直接の原因がわかると思いますよ。
    2010年11月11日 2:51
  • びーしむさん、ありがとうございます。

    やってはみたのですが、「現在の場所のソースコードを表示できません」と出てしまい、逆アセンブル結果しか見ることができませんでした。

    自己解決しました。 済みません。
    • 回答としてマーク AnalogTerebi 2010年11月11日 4:05
    2010年11月11日 3:52
  • CPen の nPenStyle の値が矛盾しているとエラーになるみたいですね。

    PS_GEOMETRIC | PS_ENDCAP_FLAT | PS_USERSTYLE にしたらエラーにならなくなりました。おそらく PS_COSMETIC や PS_ALTERNATE を指定すると PS_USERSTYLE が使用できないのではないのでしょうか?


    電柱一家
    2010年11月11日 4:20
  • 解決したのですか?解決したのなら、ほかの人が同じような問題に直面して、検索してきたときに嘆かないようにその解決策も記載しておくことをお勧めします。

    さて、エラーの原因ですが

    「CPen のコンストラクタ(またはCPen::CreatePen)にBRUSHを渡すものは、内部でExtCreatePen を呼び出していて、そのパラメータに排他になるべきものが両方とも指定されていたから」

    です。

    最初のパラメータとして渡している

    PS_COSMETIC | PS_ALTERNATE | PS_USERSTYLE

    のうち、PS_ALTERNATE | PS_USERSTYLE の部分はどちらかしか指定できません。UserStyleを必要とするのなら、PS_ALTERNATE を指定しなければ解決します。

    それと、BRUSHを初期化している部分ですが、2個目は、色(DIB_RGB_COLORSは色ではありません)を指定します。3つ目は、PS_SOLID の場合は、参照されないので、何も記述しないか、0を指定しておくのが良いのでは?と思います。

    詳しくは、ExtCreatePen API のリファレンスを参照してください(MFCのCPenではなく)。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    • 回答としてマーク AnalogTerebi 2010年11月11日 11:35
    2010年11月11日 4:21
  • 電柱一家さん、ありがとうございます。

    はい。ご指摘のところが原因でした。

    2010年11月11日 11:24
  • とっちゃんさん、ありがとうございます。 

     

    「CPen のコンストラクタ(またはCPen::CreatePen)にBRUSHを渡すものは、内部でExtCreatePen を呼び出していて、そのパラメータに排他になるべきものが両方とも指定されていたから」

    です。

    最初のパラメータとして渡している

    PS_COSMETIC | PS_ALTERNATE | PS_USERSTYLE

    のうち、PS_ALTERNATE | PS_USERSTYLE の部分はどちらかしか指定できません。UserStyleを必要とするのなら、PS_ALTERNATE を指定しなければ解決します。

      おっしゃるとおり、PS_ALTERNATE | PS_USERSTYLE が原因でした。この原因と、「リソースが利用できない」という言葉が結びつかず、混乱していました。

      

    それと、BRUSHを初期化している部分ですが、2個目は、色(DIB_RGB_COLORSは色ではありません)を指定します。3つ目は、PS_SOLID の場合は、参照されないので、何も記述しないか、0を指定しておくのが良いのでは?と思います。

    3番目の引数は、参照されないので、どう書こうかと思い迷った結果、あのようにテキトーに書いたのですが、0にしておけば良いのですね。そうします。

    2010年11月11日 11:35