모니터 정보 얻기

2011/03/31 15:31 / 컴퓨터

모니터 정보를 얻기 위해서 EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, NULL); 함수를 호출하면

MonitorEnumProc()이 콜백함수로 호출된다.


MonitorEnumProc()함수의 형태는 아래와 같다

BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
{
 TCHAR sInfo[256];

 MONITORINFOEX mi;

 mi.cbSize=sizeof(MONITORINFOEX);
 GetMonitorInfo(hMonitor,&mi);
 
 wsprintf(sInfo,"모니터 핸들 = %x, 좌표=(%d,%d)-(%d,%d) %s %s",hMonitor,
 lprcMonitor->left,lprcMonitor->top,lprcMonitor->right,lprcMonitor->bottom,
 (mi.dwFlags & MONITORINFOF_PRIMARY)==0 ? "보조모니퉈":"주 모니터", &mi.szDevice);

 AfxMessageBox(sInfo);

  return TRUE;
}


MFC에서 사용하기 위해서는

위의 콜백함수를 전역함수로 선언하고

클래스함수든 어디서든간에  EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, NULL);  를 호출하면

콜백함수가 실행되어 모니터 갯수만큼 메시지 박스가 팝업한다.

클래스 안에서 사용하기 위해서는 전역 변수를 만들어서 콜백함수안에서 정보를 넣고 클래스에서 쓰는 등으로

사용하면 된다

2011/03/31 15:31 2011/03/31 15:31
dhappy 이 작성.

1. 다이얼로그 헤더에 비트맵 변수 추가

CBitmap m_bmpDlg;

2. 클래스 위자드로  함수 추가
void CngssDlg::LoadSkin()
{
      //추가한 비트맵 리소스를 비트맵 변수에 연결
      m_bmpDlg.LoadBitmap( IDB_BITMAP_BACKGROUND );
      BITMAP bmp;
      m_bmpDlg.GetBitmap( &bmp );

      //비트맵 크기대로 Dialog사이즈 변경 및 다이얼로그 위치를 중앙으로
      SetWindowPos( NULL, 0, 0, bmp.bmWidth, bmp.bmHeight, SWP_NOZORDER );
      CenterWindow();
}

3. 클래스에서 메시지 함수 OnEraseBkgnd추가

CRect rc;
GetClientRect(&rc);

CDC MemDC;
MemDC.CreateCompatibleDC(pDC);

CBitmap* pbmpOld = MemDC.SelectObject( &m_bmpDlg );
pDC->BitBlt(0, 0, rc.right, rc.bottom, &MemDC, 0, 0, SRCCOPY);

MemDC.SelectObject( pbmpOld );
ReleaseDC(pDC);
return TRUE;

4. OnInitDialog함수에서 LoadSkin()함수 호출

LoadSkin();

5. 테스트

2009/12/18 16:23 2009/12/18 16:23
dhappy 이 작성.
TAGS , ,

MFC 비트맵에 투명 배경을 사용해본다

보통 picture control을 static 필드로 비트맵을 쓰는데 (!?!?)

투명 배경 사용을 위해 CStatic를 상속하는 클래스를 만들어본다

1. MFC클래스 생성-> 이름 넣고-> 생성 한다 (이름 예 : CCTransparentStatic )
2. 클래스 메시지 함수인 OnPaint()를 생성
3.  다음을 입력

void CMyStatic::OnPaint()
{
 CPaintDC dc(this); // device context for painting
 // TODO: Add your message handler code here

 HBITMAP old,bmp  = GetBitmap();
 BITMAP bminfo;
 CDC memDC;

 memDC.CreateCompatibleDC(&dc);
 old = (HBITMAP)::SelectObject(memDC.m_hDC,bmp);

 ::GetObject(bmp,sizeof(BITMAP),&bminfo);

 ::TransparentBlt(dc.m_hDC,0,0,bminfo.bmWidth,bminfo.bmHeight,memDC.m_hDC,0,0,bminfo.bmWidth,bminfo.bmHeight,RGB(255,255,255));

 ::SelectObject(memDC.m_hDC,old);
 memDC.DeleteDC();
 // Do not call CStatic::OnPaint() for painting messages
}

* 255.255.255로 함수 변수를 넘겼기 때문에 이미지 중 색이 하얀색(255.255.255)인 것은 투명처리된다

4. 이제 원래의 다이얼로그로 돌아가서 픽쳐컨트롤을 올리고 비트맵을 삽입한다
5. 컨트롤에 멤버변수를 만든다. (안만들어지면 컨트롤 ID를 기본인 IDB_STATIC말고 다른걸로 쓰면 된다)
6. 다이얼로그 헤더파일에 방금 만든 멤버 변수가 CStatic XXX 형태로 되어있는 것을
   방금 만든 클래스 타입으로 바꾼다. (ex CTransparentStatic XXX)

2009/12/14 16:09 2009/12/14 16:09
dhappy 이 작성.