• ベストアンサー

C++

今、C++をやっているのですが調べていたところ以下のようなのがでてきたのですが処理内容がよくわかりません。 教えてもらえませんか? for(i=0;i<16;i++){ if(dispflg==1) pDC->BitBlt(i*30,0,256/16,256,&myDC,i*16,0,SRCCPY); else pDC->BitBlt(i*30,0,256/16,256,&myDC,i*16,0,NOTSRCCPY);

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

  • ベストアンサー
  • pick52
  • ベストアンサー率35% (166/466)
回答No.1

どこが分からないのかが分からないのですが、多分これってMFCを 使用していますよね。 forやifは理解しているとしてpDCとそのメソッドのBitBltが 分からないと仮定します。 pDCは恐らくMFCのCDCクラスのポインタです。 CDC* pDC みたいな宣言があると思います。 BitBltはCDCクラスのメソッドです。 http://msdn.microsoft.com/ja-jp/library/fcbk8779(VS.80).aspx

その他の回答 (1)

回答No.2

 こんばんは。飽くまで推理になりますので、参考程度に。  myDCから16ピクセルずつ横へずらしながら16x16の正方形をpDCに向かって16個分コピーして並べているのでしょう。  ↓16x16の正方形を16個描いて並べている  ■◆□・・・◇←16個目  dispflg==1のときにそのままの色彩でpDCにコピー、それ以外の場合はmyDCの色彩を反転させてpDCにコピーしているようです。  此れは「ツールバー・イメージリスト」用のイメージをプログラム内で作成している途中段階では? と想像しました。

関連するQ&A

  • VisualC++6.0にてボタンにビットマップを表示させる方法

    VisualC++6.0のダイアログベースのアプリにおいて、 フォーム上に配置したボタン上にビットマップを表示 させたいと思ってます。OnPaint()の中で、以下のコード を書いたのですが、うまくいきません。  CWnd* myWnd = GetDlgItem(IDC_BUTTON1);  CDC* pDC = myWnd->GetDC();  CDC myDC;  CBitmap myBMP;  myBMP.LoadBitmap(IDB_BITMAP);  myDC.CreateCompatibleDC(pDC);  CBitmap* oldBMP = myDC.SelectObject(&myBMP);  pDC->BitBlt(0,0,100,100,&myDC,0,0,SRCCOPY);  myDC.SelectObject(oldBMP); ビットマップはちゃんと書かれてはいますが、その上にボタンが 描かれてしまうので、ビットマップが隠されてしまいます。 解決方法を教えてくださいますでしょうか。 よろしくお願いします。 % 絵をクリックするとアクションを起こすようにしたいので、 % ピクチャーボックスでも試してみました。これだとビット % マップはちゃんと表示されますが、BN_CLICKEDを書いて % ピクチャーボックスをクリックしてもOnPict()に処理が % 移りません。

  • 画像の印刷について

    環境はWIN98 VC++6.0 MFCです。 初めて印刷に挑戦します。 TextOut()で書いた文字は印刷プレビューでちゃんと表示されましたが、以下のようにして取りこんだ画像を印刷プレビューで見ても何も表示されません。 どうしたら印刷できるようになりますか? void CXxxView::OnDraw(CDC* pDC) { CXxxDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: この場所にネイティブ データ用の描画コードを追加します。 CDC myDC; CBitmap myBMP; myBMP.LoadBitmap(IDB_BITMAP3); myDC.CreateCompatibleDC(pDC); CBitmap* oldBMP=myDC.SelectObject(&myBMP); pDC->BitBlt(10,10,60,100,&myDC,0,0,SRCCOPY); myDC.SelectObject(oldBMP); }

  • C/C++ ソースのコーティングについて

    最近、C/C++ ソースのコーディングに関して興味を持ちました。 そこで質問します。 皆様は普段プログラムを書くときにどんなコーディングをしていますか。 人それぞれ記述が異なると思いますが、何か自分の中でのコーディング・ルールが あれば教えて下さい。できるだけ詳しくお聞きしたいです。 ちなみに私の場合は (1)return、sizeof 演算子には必ず括弧を付けます。 (2)if、else、while、for には必ず{、}のブロックを記述して省略しません。 (3)関数を呼び出すとき、引数と引数はスペースを必ず挿入します。→strcpy( s, t );  ただし、if、while、for の条件式の中ではスペースを入れません。→while ( fgets(buff,sizeof(buff),fp) != NULL ){ … } (4)2項(3項)演算子はスペースを両端に挿入します。→ret = 2 + 3;  単項演算子はスペースは挿入しません。→i++、*str (5)ブロックのインデントは  if ( 条件式 ){   処理  }  else{   処理  } などがあります。 特に詳しく知りたいのは(5)です。 タイプ1 if ( 条件式 ){  処理 } else{  処理 } タイプ2 if ( 条件式 ){  処理 }else{  処理 } タイプ3 if ( 条件式 ) {  処理 } else {  処理 } タイプ4 if ( 条件式 )  {  処理  } else  {  処理  } それではコーディング・ルール(こだわり)などを教えて下さい。 なお、今回の質問は、より見やすいコーディングを目指しての質問です。 よろしくお願いします。

  • VBAで、[.FoundFiles.count]で取得した値の変数Cへの渡し方

    VBAで、[.FoundFiles.count]で取得した値を C=.FoundFiles.count(理想) としたいです。そして以下のコードのFor文の.FoundFiles.countをCとしたいのですが、思うようにいきません。その方法を教えて頂きたいのです。宜しくお願い致します。 With Application.FileSearch .LookIn = largept .Filename = "*.txt" If .Execute > 0 Then   For i = 1 to .FoundFiles.Count     ...     処理     ...   Next i Else End If End With

  • RAW画像高速表示について

    画像処理ソフトの研究をc言語で行っています。 GUIの導入を目指してVC++の勉強を始めたのですが、RAW画像をうまく表示できず困っています。 現在練習と言うことで、スクロールバーの値によって画像を二値化して表示する処理を行っています。 表示部分を以下のように書いた(ほとんど本を丸写したので意味もちゃんとわかっていませんが)のですが、動作が遅すぎて困っています。 (IMG:unsigned char型の二次元配列にRAWデータを格納したもの) 高速で表示することはできないのでしょうか? アドバイス等、よろしくお願いします。 void Cimage_binView::writeImg(void) {  CClientDC myDC(this);  CDC *pDC = m_pict.GetDC();  int col,row;  int I;  CRgn myRgn;  RECT rect;  m_pict.GetClientRect(&rect);  myRgn.CreateRectRgn(rect.left, rect.top, rect.right, rect.bottom);  pDC->SelectObject(&myRgn); //画像出力  for(col=0;col<256;col++)   for(row=0;row<256;row++)   {    I=IMG[col][row];        if(I<m_sbar1.GetScrollPos())I=0;//スクロールバーの値より小さければ黒    else I=255;//大きければ白にする }    pDC->SetPixel(row,col,RGB(I,I,I));  } }

  • ダイアログにビットマップを貼り付けた時にフリーズしてしまう

    お世話になります、fujicafeです。 現在、MFCにてダイアログベースのアプリケーションを作成中なのですが、ダイアログにビットマップを貼り付けてOnPaint()で表示するようにプログラムを作成したのですが、何度かダイアログの表示を繰り返すとOnPaintでのビットマップの読み込みが途中まででフリーズしてしまう現象が起きてしまいました。 プログラムは以下のように作成しています void C****Dlg::OnPaint() {  CDC* pDC = this->GetDC(); CDC myDC; CBitmap newbitmap; CBitmap* oldbitmap; CRect rc; GetClientRect(rc); newbitmap.LoadBitmap(IDB_BITMAP); myDC.CreateCompatibleDC( pDC ); oldbitmap=myDC.SelectObject( &newbitmap ); pDC->BitBlt( 0, 0, rc.Width(), rc.Height(), &myDC, 0, 0, SRCCOPY ); myDC.SelectObject(oldbitmap); } としています。 初めにこのダイアログを表示時は、ちゃんとビットマップが表示されるのですが、他のダイアログでこのダイアログを表示させた時にビットマップが上半分まで表示されて、動作がフリーズしてしまう現状です。 なにかよい打開策がありましたら、教えていただけたらと思っています。宜しくお願いいたします。

  • C言語の配列の使い方について質問です。

    以下のプログラムを配列を使って見やすくしたいのですが、どのように作ったら良いでしょうか? 宜しくお願いします。 #include<stdio.h> int main(void) { int a, b, c, d, e, f, g, h, i, j, k, l, m ,n, o; /*5段目の処理*/ for(a = 1; a <= 15; a++) { for(b = 1; b <= 15; b++) { if(a == b) continue; for(c = 1; c <= 15; c++) { if(a == c || b == c) continue; for(d = 1; d <= 15; d++) { if(a == d || b == d || c == d) continue; for(e = 1; e <= 15; e++) { if(a == e || b == e || c == e || d == e) continue; // printf("%d %d %d %d %d\n", a, b, c, d, e); ////4段目//// if(a>b){ f=a-b; } else if(a<b){ f=b-a; } if(b>c){ g=b-c; } else if(b<c){ g=c-b; } if(c>d){ h=c-d; } else if(c<d){ h=d-c; } if(d>e){ i=d-e; } else if(e<d){ i=e-d; } // printf(" %d %d %d %d \n", f, g, h, i); /////3段目//// if(f>g){ j=f-g; } else if(f<g){ j=g-f; } if(g>h){ k=g-h; } else if(g<h){ k=h-g; } if(h>i){ l=h-i; } else if(h<i){ l=i-h; } // printf(" %d %d %d \n", j, k, l); /////2段目//// if(j>k){ m=j-k; } else if(j<k){ m=k-j; } if(k>l){ n=k-l; } else if(k<l){ n=l-k; } // printf(" %d %d \n", m, n); /////三段目///// if(m>n){ o=m-n; } else if(m<n){ o=n-m; } // printf(" %d \n", o); if(a != b != c != d != e != f != g != h != i != j != k != l != m != n != o){ printf("%d %d %d %d %d\n", a, b, c, d, e); printf(" %d %d %d %d \n", f, g, h, i); printf(" %d %d %d \n", j, k, l); printf(" %d %d \n", m, n); printf(" %d \n", o); } } } } } } }

  • CDCオブジェクトの作成について

    // あまり意味はないのですが、 //CDCのオブジェクトを宣言して、 //そこへ図形を描画して、 //クライエント領域にBitBltするときは、 //どうすればいいですか? //CreateCompatibleDCが関係していると思っています。 //ですが、上手く描画できません。 //教えてください、 //お願いします。 void CProject1View::OnDraw(CDC* pDC) { CProject1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; ////////////////////////////////////////////////////// CDC imageDC; CPen pen,*oldpen; pen.CreatePen(PS_SOLID,3,RGB(255,0,0)); imageDC.CreateCompatibleDC(pDC); for(int i=0;i<100;i++) { for(int j=0;j<100;j++) { imageDC.SetPixel(i,j,RGB(128,0,0)); } } oldpen=imageDC.SelectObject(&pen); imageDC.Rectangle(50,50,400,300); pDC->BitBlt(0,0,600,600,&imageDC,0,0,SRCCOPY); imageDC.SelectObject(oldpen); ////////////////////////////////////////////////////// }

  • win32api複数のタイマーを同時に処理するには

    いつもお世話になっています。 いま、タイマーを使ったアニメーションをやっているのですが、 SetTimer(VisualWnd,ID_YOKOUGOKI,200,NULL); SetTimer(VisualWnd,ID_MOJIOKURI,20,NULL); ようにすると、下のID_MOJIOKURIの部分しか処理されません。 case WM_TIMER: switch(wParam){ case ID_YOKOUGOKI: if(syouninkaiwa<13){ if(playeryoko==1){ playeryoko=2; }else if(playeryoko==2){ playeryoko=3; }else if(playeryoko==3){ playeryoko=4; }else if(playeryoko==4){ playeryoko=1; } if(syouninyoko==1){ syouninyoko=2; }else if(syouninyoko==2){ syouninyoko=3; }else if(syouninyoko==3){ syouninyoko=4; }else if(syouninyoko==4){ syouninyoko=1; } } break; case ID_MOJIOKURI: if(syouninkaiwa==1){ mojiokuri+=1; } break; } InvalidateRect(VisualWnd,NULL,FALSE); return 0; また描画処理は if(playeryoko==1){ BitBlt(hdcv, 250,132, 34, 32, memdc[50], 0, 0, SRCCOPY); }else if(playeryoko==2){ BitBlt(hdcv, 249,130, 34, 32, memdc[55], 0, 0, SRCCOPY); }else if(playeryoko==3){ BitBlt(hdcv, 250,132, 34, 32, memdc[50], 0, 0, SRCCOPY); }else if(playeryoko==4){ BitBlt(hdcv, 249,130, 34, 32, memdc[56], 0, 0, SRCCOPY); } if(syouninyoko==1){ BitBlt(hdcv, 220,130, 29, 32, memdc[51], 0, 0, SRCCOPY); }else if(syouninyoko==2){ BitBlt(hdcv, 220,130, 29, 32, memdc[57], 0, 0, SRCCOPY); }else if(syouninyoko==3){ BitBlt(hdcv, 220,130, 29, 32, memdc[51], 0, 0, SRCCOPY); }else if(syouninyoko==4){ BitBlt(hdcv, 220,130, 29, 32, memdc[58], 0, 0, SRCCOPY); } }else{ BitBlt(hdcv, 250,130, 34, 32, memdc[50], 0, 0, SRCCOPY); BitBlt(hdcv, 220,130, 29, 32, memdc[51], 0, 0, SRCCOPY); } SetTimer(VisualWnd,ID_YOKOUGOKI,200,NULL); SetTimer(VisualWnd,ID_MOJIOKURI,20,NULL); if(syouninkaiwa == 0){ TextOut(hdcv,350,350,TEXT("push Enter"),lstrlen(TEXT("push Enter"))); }else if(syouninkaiwa == 1){ if(mojiokuri==1){ wsprintf(TEXT1,L"○"); }else if(mojiokuri==2){ wsprintf(TEXT1,L"○○"); }else if(mojiokuri==3){ wsprintf(TEXT1,L"○○○"); }else if(mojiokuri==4){ wsprintf(TEXT1,L"○○○○"); }else if(mojiokuri==5){ wsprintf(TEXT1,L"○○○○○"); }else if(mojiokuri==6){ wsprintf(TEXT1,L"○○○○○○"); }else if(mojiokuri==7){ wsprintf(TEXT1,L"○○○○○○○"); }else if(mojiokuri==8){ wsprintf(TEXT1,L"近頃、冒険者が多"); } ・・・・・・・・・・・・・・・・・・・・ TextOut(hdcv,20,240,TEXT1,lstrlen(TEXT1));   というふうです。 どちらが悪いのか分かりません。 ちなみに、タイマーの時間を同じにしたら、同時にできましたが、両方の処理が遅くなりました。   どのように解決したらよいのか教えてください。お願いします。

  • C言語の問題がわからないです。

    C言語のプログラムで、列数を自分で決めて、 (例)3列         ●(この行を最後として)   □● ●□● 上記のプログラムを作りたいのですが、 上手くいきません。途中まで作ったのですが、なかなか思うようにいかないです。どうすれば上記のようになりますでしょうか? #include <stdio.h> void disp(int x, int y); main() { int i,n; printf("表示する列:"); scanf("%d",&n); disp(3,3); for(i=1;i<=n;i++){ if(i%2==0){ disp(n-i,4); disp(i,2); } else{ disp(n-i,4); disp(i,1); } disp(1,3); } } void disp(int x, int y) { int i; for(i=0;i<x;i++){ if(y==1){ printf("●"); } else if(y==2){ printf("□"); } else if(y==3){ printf("\n"); } else{ printf("\0"); } } }

専門家に質問してみよう