• ベストアンサー

? ←これってどうゆう意味ですか?C++MFCです。

C++のMFCにてカスタムコントロールを作ろうとして いろいろサイトを調べ、コピペで何とか作れたのですが、どうやってるのかよくわからないんです。 特に「?」これ。 void CCstBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CBrush br((lpDrawItemStruct- >itemState&ODS_SELECTED) ? (m_color ? ((m_color&0xfefefe)>>1) : 0x303030) : m_color); FillRect(lpDrawItemStruct->hDC,&lpDrawItemStruct->rcItem,(HBRUSH)br); } ってゆうか、うまくコードが載りませんね? これもなんとかならないんですかね? 話を戻します。 「?」今までのコードではみたことなくて、調べてみてたんですが、検索エンジンで入力すると消えるんですよね。これは困った。 どうゆう意味? ご教授お願いします。 また良いサイトありましたら教えてください。 お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

3項演算子とか条件演算子とかいいます。 条件?真の時の式:偽の時の式; という風に書きます。 条件によってこの式全体の値が決まるということです。 例えば x<0 ? -1*x : x; とすれば、xの絶対値を求めることになります。

anan23
質問者

お礼

早々な回答ありがとうございます。 初歩的な構文だったようですね。 勉強不足でした。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • umota
  • ベストアンサー率46% (150/324)
回答No.4

三項演算子 でググる

anan23
質問者

お礼

早々ありがとうございます。 解決しました。 助かりました!

全文を見る
すると、全ての回答が全文表示されます。
  • driverII
  • ベストアンサー率27% (248/913)
回答No.3

(条件式) ? (式が真の時の値) : (式が偽の時の値) ですな。 3項演算子です。

anan23
質問者

お礼

ありがとうございます。 解決しました。

全文を見る
すると、全ての回答が全文表示されます。
  • 6dou_rinne
  • ベストアンサー率25% (1361/5264)
回答No.1

C言語の教科書・参考書に載っているはずですが...  

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • マウスの反応

    C言語とWIN32APIでプログラミングしています。 いつも多くの方にお世話になっています。 ■ボタンの上にマウスカーソルが来た時、ボタンが反応する様な事を考えています。 ■Web画面でよくあるロ-ルオーバーの様な事です。 上記の様な事を思い、下記の様に記載しました(概略)。 ところが、クリックには反応しますが オンマウスには反応しません。 ■質問 ・マウスカーソルがボタンに乗った時、反応するには何が必要ですか? case WM_DRAWITEM: if(wp==ID_BTN_0) { DrawText(DrawItem->hDC,str,-1,&DrawItem->rcItem,DT_CENTER); ******************************************************** //オンマウスで色を反転する.....目的 if((DrawItem->itemAction) & (ODA_FOCUS)){ InvertRect(DrawItem->hDC,(LPRECT)&DrawItem->rcItem); } ******************************************************** if((DrawItem->itemState) & (ODS_SELECTED)){ DrawEdge(DrawItem->hDC,(LPRECT)&DrawItem->rcItem,EDGE_SUNKEN,BF_RECT); }else{ DrawEdge(DrawItem->hDC,(LPRECT)&DrawItem->rcItem, EDGE_RAISED,BF_RECT); } } break;

  • MFCのC++/CLI へIntPtrをキャスト

    MFCのC++/CLI へIntPtrのデータを受け渡せません。。。 コードは以下になります。 ------------------------------ C# System.IntPtr hBitmap; p.GetBitmapHandle((void*)hBitmap);//CLI側のメソッド ------------------------------ C++/CLI (MFC) void GetBitmapHandle( void* hBitmap ){ hBitmap = m_hBitmap; } HBITMAP m_hBitmap; ------------------------------ 非常に困ってます。助けてください!

  • リージョンのフレームを描画する関数、FramRgn()

    リージョンのフレームを描画する関数、FramRgn()について、 第三引数に、GetStockObject()は使えないんですか? 以下のエラーが出ました。 エラーコード FrameRgn(hdc,hrgn,GetStockObject(BLACK_BRUSH),2,5); 'void *' 型は 'HBRUSH__ *' 型に変換できない 3 番目のパラメータは HBRUSH__ * 型として定義されているので void * 型は渡せない 教えてください。

  • C言語・Windows RECTが渡せない

    C言語のWindowsプログラムで、左クリック後に四角形の描画をしたいのですがうまくいきません。 WM_LBUTTONDOWNイベントで定義したRECT構造体を、別の関数に渡しRectangleで描画したいのですが、その関数内でRECTの値を調べるととんでもない値になっています。 何度やってもどうして値がおかしくなるのかわかりません。 WM_LBUTTONDOWNもWM_PAINTも正常に反応していると思います。 どうか知恵をお貸しくださいm(_ _)m 以下ソースコードのメッセージ処理部分です。 ウィンドウ生成のひな型はサイトの物を丸写しし、正常に動作することを確認しています。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rcPos; switch (msg){ case WM_LBUTTONDOWN: rcPos.top =0; rcPos.left =0; rcPos.bottom =100; rcPos.right =100; InvalidateRect(hWnd, &rcPos, FALSE); break; //ウィンドウの描画 case WM_PAINT: hdc = BeginPaint(hWnd, &ps); DrawGr(hWnd, hdc, &rcPos); EndPaint(hWnd, &ps); break; //ウィンドウの削除 case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } return (0L); } //描画 int DrawGr(HWND hWnd, HDC hdc, RECT *rcPos) { int i; HBRUSH hBrush, hOldBrush; char *str_org = "rc.top=%d rc.left=%d rc.bottom=%d rc.right=%d"; char strx[256]; //四角形 hBrush = CreateSolidBrush(RGB(100, 100, 255)); hOldBrush = (HBRUSH)SelectObject(hdc, hBrush); //デバッグ用 wsprintf((LPSTR)strx, (LPCSTR)str_org, rcPos->top, rcPos->left, rcPos->bottom, rcPos->right); MessageBox(hWnd, (LPCSTR)strx, (LPCSTR)"終了確認", MB_OKCANCEL | MB_ICONQUESTION); Rectangle(hdc, rcPos->left, rcPos->top, rcPos->right, rcPos->bottom); SelectObject(hdc, hOldBrush); DeleteObject(hBrush); return 0; }

  • javaのエラーの意味がわかりません、お願いします

    今日は、javaを勉強している初心者です。 以下のコードを書いてやりましたが、「sleep(Graphics)は引数()に適用できません」、「Color.Whiteを解決できません」とエラーがでます、エラーの意味が分かりません。 一体何処が間違っているのでしょうか、宜しくお願いします。 ===================================================================== public class ani_Moving_Ball extends Applet { int x; public void paint(Graphics g) { for(x=0 ; x<180 ; ++x) { clear(g); g.drawOval(x,90,19,19); sleep(); } } public void clear(Graphics g) { g.setColor(Color.White); g.fillRect(0,80,200,40); g.setColor(Color.Black); } public void sleep(Graphics g) { double s=0.0; for (int j=1 ; j<100 ; ++j) { for (int k=1 ; k<100 ; ++k) { s =+ Math.sin((double)j); } } } }

    • ベストアンサー
    • Java
  • MFCでボタンを押して図形を操作するには

    Visual studio 2008のMFCで、とあるプログラムを作っております。 ボタンをクリックすると円が出てきて、さらにクリックするとその下に円が表示されるというプログラムまで作りました。 void C***Dlg::OnBnClickedButton1(){ CDC* pDC=m_pict.GetDC(); CRect rect; m_pict.GetClientRect(&rect); pDC->Rectangle(&rect); CPen pen_red(PS_SOLID,1,RGB(255,0,0)); CBrush br_yellow(RGB(255,255,0)); CPen* oldpen=pDC->SelectObject(&pen_red); CBrush* oldbr=pDC->SelectObject(&br_yellow); pDC->Ellipse(-252,i-43,-212,i-3); i=i+48; UpdateWindow(); pDC->SelectObject(oldpen); pDC->SelectObject(oldbr); // TODO: ここにコントロール通知ハンドラ コードを追加します。 } とりあえずOnBnClickedButton1関数はこんな感じです。 ここから、 (1)クリックすると円が自動で動き、途中で止まり、しばし経ってから動き出してやがて上へ消えてゆく。 (2)2つ目の円も同じように動くが、1つ目の円が止まっていて重なりそうになったらその手前で止まる。 (3)1つ目の円が上に消えたら、2つ目の円が動き出し、以降は(1)と同じ動きをする。 このようなプログラムを作りたいのですが、初心者のためどのようなツールをどのように使えば良いのかわかりません。 どなたがヒントだけでもご教授頂けませんでしょうか?

  • C言語で再帰的処理が出来ない理由

    以下のサイトでC言語の勉強をしているのですが、このサイトのソースコードをコピペして実行してみたら上手くいきませんでした。 http://wisdom.sakura.ne.jp/programming/c/c30.html ========================== #include<stdio.h> void func(int ); int main() { func(0); printf("プログラムを終了します"); return 0; } void func(int max) { if (max <= 10000) { printf("%d\r",max); func(max + 1); } } ========================== 実行してみると、何故か4700~4800の辺りで止まってエラーになってしまいます。 どうしてエラーになるのでしょうか?

  • object-cで別の.mのメソッドを呼べるか?

    object-cで a1.mというファイルに - (void)m1 { } というメソッドがあるとします。 b1.mファイルから m1というメソッドを呼び出す方法がありましたら教えてください。 b1.mの中にm1メソッドがある場合は [self m1]; と書けば呼び出せると思います。 何か似たような書き方で呼ぶ方法がありますでしょうか? どこかのサイトやブログや 公開ソースコードなどを 紹介していただく教え方でもよいのでお願いいたします。

  • OnPaint() とOnDraw()の違いについて

    OnPaint内に記述した下記コードでビットマップが描画されますが、OnDraw内だと描画されません。 どうしてなのか教えてください。 お願いします。 void CAbcView::OnPaint() { HBITMAP myDIB; // ビットマップのハンドル HBITMAP oldDIB; HDC hDC; // デバイスコンテキストのハンドル HDC hCompatiDC; // メモリデバイスコンテキスト PAINTSTRUCT ps; // クライアント領域の描画に使う情報を保持 if(!m_BmpInfo) return; hDC = ::GetDC(m_hWnd);//これでもOK ::BeginPaint(m_hWnd,&ps); hCompatiDC = ::CreateCompatibleDC(hDC);//hDC); myDIB = ::CreateDIBitmap(hDC,&m_BmpInfo->bmiHeader, CBM_INIT,m_BmpImage,m_BmpInfo,DIB_RGB_COLORS); oldDIB=(HBITMAP)::SelectObject(hCompatiDC,myDIB); BitBlt(hDC,5,25,m_BmpInfo->bmiHeader.biWidth, m_BmpInfo->bmiHeader.biHeight,hCompatiDC,0,0,SRCCOPY); 略 } 環境 WIN98 VC++6.0 MFC にて

  • CLRでのListBoxのオーナードローのやり方。

    Visual C++のCLRでフォームアプリケーションを作っていて、ListBoxのオーナードローの方法がわからないので質問させてもらいました。 CLRでプログラミングしたことが無く書籍などを読んだこともなく見よう見まねで作っています。 やりたいことはとりあえず http://dobon.net/vb/dotnet/control/lbownerdraw.html にあることです。 サンプルプログラムはVBとC#でC++がありません。 MSDN(http://msdn.microsoft.com/ja-jp/library/system.windows.forms.listbox.drawitem.aspx)も同様でVBとC#のサンプルプログラムでC++がありませんでした。 とりあえず。 C#のサンプル----------------------------------------------- //DrawItemイベントハンドラ //項目を描画する private void ListBox1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) { //背景を描画する //項目が選択されている時は強調表示される e.DrawBackground(); //文字を描画する色の選択 Brush b = null; if ((e.State & DrawItemState.Selected) != DrawItemState.Selected) { //選択されていない時 switch (e.Index % 3) { case 0: b = new SolidBrush(Color.Red); break; case 1: b = new SolidBrush(Color.Blue); break; case 2: b = new SolidBrush(Color.Green); break; } } else { //選択されている時はそのままの前景色を使う b = new SolidBrush(e.ForeColor); } //描画する文字列の取得 string txt = ((ListBox) sender).Items[e.Index].ToString(); //文字列の描画 e.Graphics.DrawString(txt, e.Font, b, e.Bounds); //後始末 b.Dispose(); //フォーカスを示す四角形を描画 e.DrawFocusRectangle(); } ----------------------------------------------- を参考にしてForm1に private: System::Void ListBox1_DrawItem(System::Object^ sender, System::Windows::Forms::DrawItemEventArgs^ e) { //背景を描画する //項目が選択されている時は強調表示される e->DrawBackground(); //文字を描画する色の選択 } と書いてみたのですが、そのあとどうすればよいかわかりません。 わかる方、回答お願いします。