SetPixelで描写できない領域があります・・・

このQ&Aのポイント
  • WindowsAPIの勉強中にSetPixel()で線を描いていましたが、特定の領域で線が出てこない問題が発生しました。
  • 線の長さを長くしようとしたときに、300~800の範囲で線が描写されなくなりました。
  • Windows VistaのノートパソコンでVC++ 2008 Express Editionを使用しています。詳しい方からのアドバイスをお待ちしています。
回答を見る
  • ベストアンサー

SetPixelで描写できない領域があります・・・

下のホームページでWindowsAPIの勉強をしていました。 http://wisdom.sakura.ne.jp/system/winapi/win32/win22.html それでSetPixel()で線を描いていました。↓のような感じです。 for (iCount = 0 ; iCount < 100 ; iCount++) SetPixel(hdc , 10 + iCount , 10 , 0xFF); 線の長さを長くしようと思ってiCount < 1000とやってみました。 すると300<iCount<800くらいの領域で線が出ないところが出でしまいました・・・。 もし分かる人がいたら教えてください。 OSはwindows vistaでノートパソコンです。 VC++2008 ExpressEditionを使ってます。

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

  • ベストアンサー
回答No.1

自分も同じ症状に出くわしたので調べてみましたが VistaでWindows Aeroをオフにするとこの不具合が発生するようです。 自分はAeroをオンにしたところ解決しました。

sorokuku
質問者

お礼

お礼が遅くなって申し訳ありません 先程試してみたところ解決できました。 ありがとうございました。

関連するQ&A

  • C 多角形を半透明に塗る方法

    C#の、多角形を半透明に塗るプログラムがあります。 Point[] pa; SolidBrush brush1 = new SolidBrush(Color.FromArgb(128,Color.Black)); g.FillPolygon(brush1, pa); これと同じことをCで記載したいので http://www.geocities.jp/ky_webid/win32c/010.html や http://wisdom.sakura.ne.jp/system/winapi/win32/win29.html を参考にして、やっと多角形の塗りつぶし(赤)まではできました。 が、半透明にする方法がわかりません。 よろしくお願いします。 POINT pa[]; SelectObject(hdc , CreateSolidBrush(0xFF)); SetPolyFillMode(hdc , WINDING); Polygon(hdc , pa , n); DeleteObject(SelectObject(hdc , GetStockObject(WHITE_BRUSH)));

  • 色描画

    以下は、ウインドウプロシージャ内でのプログラムです。 RGB( )ですが、0xFFは、255の事ですよね? x*0xFF/rect.rightこの計算式は、何を求めているんですか? 教えてください。 HDC         hdc; PAINTSTRUCT  ps; COLORREF    color; LONG        x,y; RECT        rect; switch(umsg){   case  WM_PAINT:       hdc =BeginPaint(hwnd,&ps);       GetClientRect(hwnd,&rect);       for(y=0;y<rect.bottom;y++){          for(x=0;x<rect.right;x++){            color=RGB(x*0xFF/rect.right,0,0);            SetPixel(hdc,x,y,color);          }       }

  • SetPixel関数のmath.h

    WindowsXPのノートでVisualC++2008ExpressEditionを使っています。 SetPixel関数で円を描くプログラムで、math.hの問題だと思われる4つのエラーでコンパイルできません。 宣言は #include<windows.h> #include<math.h> ウィンドウプロシージャ内で switch (msg) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); for (i = a - r;i <= a + r; i++) { x = i; y = (int)sqrt(pow(r, 2) - pow(x - a, 2)) + b;←96行目 SetPixel(hdc, x, y, RGB(0, 0, 0)); y = (int)-sqrt(pow(r, 2) - pow(x - a, 2)) + b;←98行目 1>c:\documents and settings\REI\my documents\visual studio 2008\projects\setpixel01\setpixel01\setpixel01.cpp(96) : error C2668: 'pow' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照) 1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(575): 'long double pow(long double,int)' の可能性があります。 1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(527): または 'float pow(float,int)' 1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(489): または 'double pow(double,int)' 1> 引数リスト '(int, int)' を一致させようとしているとき 同じ内容のエラーが96行目なのが2回、98行目なのが2回出ます。math.hを編集すればいいんでしょうか?gccならコマンドラインから-lmでいいかもしれないんですが。自分の入力ミスはないと思います。 どなたかお分かりになる方、教えていただけないでしょうかm(_ _)m

  • コールバック関数のメンバ関数化

    コールバック関数のメンバ関数化について質問です。 WindowsAPIでウィンドウプロシージャ(コールバック関数)をクラスのメンバ関数に しようと思っているのですが、出来るのでしょうか? たとえば、 http://wisdom.sakura.ne.jp/system/winapi/win32/win10.html このサイトにある LRESULT CALLBACK WndProc(HWND hWnd , UINT Msg , WPARAM wParam , LPARAM lParam); をクラスのメンバ関数にしたいです。 開発環境 XP C,C++ Visual Studio 2005

  • ボタンの更新速度について

    オーナー描画ボタンの更新速度について質問です。 ボタンの更新(ボタンの座標を変えた時)の時に、 ボタンの数が多い場合、更新が遅い(40個の時は約5秒)のですが、 何か原因があるのでしょうか? それとも、元々更新が遅いのでしょうか? ボタンの数は、増えたり減ったりするので多い場合でも更新を速くしたいです。 ソースは長いので載せる事が出来ません。 ちなみに、ボタンはこのサイトに載ってる様なものです。 http://wisdom.sakura.ne.jp/system/winapi/win32/win61.html 開発環境 XP Visual Studio 2005 C、C++でWindowsAPIを使用しています。

  • 点の描画について(win32API)

    win32APIでウィンドウに点を描画するプログラムを作ったのですが、SetPixel関数で点を描画しようとすると、特定のx座標に点が描画されません。線は普通に描画されるのですが・・・。 /*ソース*/ #include <windows.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT Msg, WPARAM wp, LPARAM lp) { static HDC hdc; static PAINTSTRUCT ps; switch(Msg) { case WM_PAINT: //【ここです!】 hdc = BeginPaint(hwnd, &ps); MoveToEx(hdc , 0 , 300 , NULL); //比較のため線を引く準備 LineTo(hdc,1200,300); //比較のため線を引く for( int j = 1000; j > 0 ; j-- )SetPixel( hdc, j, 100, RGB(0,200,100) ) ; for( int j = 1000; j > 0 ; j-- )SetPixel( hdc, j, 200, RGB(0,200,100) ) ; //ここで点を描画 EndPaint(hwnd, &ps); return 0; case WM_DESTROY: //終了処理 PostQuitMessage(0); return 0; } return DefWindowProc( hwnd, Msg, wp, lp ); } //↓ごく普通のWinMainです。無視してください。 int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow ) { HWND hwnd; MSG msg; WNDCLASS winc; winc.style = CS_HREDRAW | CS_VREDRAW; winc.lpfnWndProc = WndProc; winc.cbClsExtra = winc.cbWndExtra = 0; winc.hInstance = hInstance; winc.hIcon = LoadIcon(NULL , IDI_APPLICATION); winc.hCursor = LoadCursor(NULL , IDC_ARROW); winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); winc.lpszMenuName = NULL; winc.lpszClassName = TEXT("KITTY"); if (!RegisterClass(&winc)) return -1; hwnd = CreateWindow( TEXT("KITTY") , TEXT("Kitty on your lap") , WS_OVERLAPPEDWINDOW | WS_VISIBLE , CW_USEDEFAULT , CW_USEDEFAULT , CW_USEDEFAULT , CW_USEDEFAULT , NULL , NULL , hInstance , NULL ); if (hwnd == NULL) return -1; while( GetMessage(&msg , NULL , 0 , 0) ) DispatchMessage(&msg); return msg.wParam; } 解決策を模索するもうまくいかず・・・どうか回答よろしくお願いします。

  • DeleteObjectについて(初心者です)

    今こちらのサイトを参考に、APIを学んでいるものです。 http://wisdom.sakura.ne.jp/system/winapi/win32/win26.html 質問させて頂きますのはここの部分です。 LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) { HDC hdc; static LOGPEN lopnPen; PAINTSTRUCT ps; switch (msg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_CREATE: lopnPen.lopnStyle = PS_SOLID; lopnPen.lopnWidth.x = 5; lopnPen.lopnColor = 0XFF; return 0; case WM_PAINT: hdc = BeginPaint(hwnd , &ps); SelectObject(hdc , CreatePenIndirect(&lopnPen)); Ellipse(hdc , 10 , 10 , 200 , 50); DeleteObject(SelectObject(hdc , GetStockObject(WHITE_BRUSH))); EndPaint(hwnd , &ps); return 0; } return DefWindowProc(hwnd , msg , wp , lp); } 一度yahoo知恵袋にて質問したのですが、別の面で少し疑問が残ったのでここでもう一度質問させて頂きます。 SelectObjectは引数で渡されたオブジェクトを選択中にし、返り値として以前に選択していたオブジェクトを返すという回答がありましたが、それならば DeleteObject(SelectObject(hdc , GetStockObject(WHITE_BRUSH))); のGetStockObjectの引数WHITE_BRUSHを別のもの(例えばBLACK_PEN)に置き換えても、返り値は以前選択していたオブジェクトのままなので何も相違ないはずですよね? 当方理解もままならない初心者ですから盛大な勘違いをしているかもしれません。 分かる方、どうかご教授お願いします。

  • 塗りつぶしモード ALTERNATEとWINDING

    WINDOWSプログラミングで CreatePolygonRgnで多角形のリージョンを つくるときに、 http://www.kumei.ne.jp/c_lang/sdk2/sdk_126.htm にあるように、塗りつぶしモードがALTERNATEとWINDINGの2つあるのですが、 ALTERNATE:多角形の奇数番号の辺と偶数番号の辺の間を塗りつぶす WINDING:ワインディング値(多角形を描画するペンがリージョンの周囲を回る回数)が0でないリージョンを塗りつぶす という説明なんですが、意味がよくわからないでおります。 http://wisdom.sakura.ne.jp/system/winapi/win32/win29.html に描画例があるのですが、なんでこういう図になるのかがわかりません。 多角形の奇数番号の辺と偶数番号の円の間とは、どんな領域になるのでしょうか。回る回数が0でないとは、どういう意味になるのでしょうか。 ご存知の方いましたら教えてください。よろしくお願いします。

  • 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 にて

  • C++ ダイアログ画面について

    VC++2008で,新規ダイアログ画面を作成します。このときダイアログにOKとキャンセルボタンが構成され,画面に文字が表示されます。ここで画面にグリッドを付けます。見えやすいように 2×2 のグリッドにします。すると画面にグリッドが表示されます。この場合,全体がグリッドエリアになる場合と、グリッドエリアと非グリッドエリアが繰り返される(タイル表示?)画面になる場合があります。後者のばあいだと,画面にSetPixelで線を引いた時,非グリッドエリアで線が消えてしまいます。 この非フリッドエリアがどこで設定されるのか、または切り替えられるのか ご指導をお願いいたします。ダイアログプロパティではないようです。いろいろ調べ、初期化、再インストールもしましたが解決できません。 OSはVistaです。OSがXP Homeでは、全画面グリッドとなります(あまり使用していない)。 よろしく、お願いいたします。

専門家に質問してみよう