상세 컨텐츠

본문 제목

[MFC] OnSize 관련

프로그래밍 관련/MFC

by AlrepondTech 2017. 7. 25. 17:59

본문

반응형

 

 

=================================

=================================

=================================

 

 

 

출처: http://www.gpgstudy.com/forum/viewtopic.php?t=8785

 

 

 

WM_SIZING 은 리사이징 되고있는때 나는 메세지이고

WM_SIZE 는 리사이징이 끝났을때 나는 메세지입니다.

하지만 윈도XP는 리사이징하면서도 계속 표시가 되기 때문에

크기가 1픽셀이라도 바뀔때마다 WM_SIZE 메세지가 날아옵니다.

그런데 DX9 예제를 보면.. 리사이징 될 떄는 그냥 별다른 처리를 안하다가

리사이징이 끝났을때 변화된 화면 비율을 계산하여 처리를 합니다.

그런데 mfc 에서 이런식으로 하려면 어떻게 해야 하죠?

제가 왜 이런 질문을 하냐면

OnSize 함수 속에 DX 리셋 루틴을 넣었더니.. 포커스를 잃어버려서 중간에 메세지가 끊겨버립니다.

(즉, 1픽셀 움직이면 그다음부터 리사이징아 안됩니다.)

그래서 리사이징이 끝났을때만 처리를 하려고 하는데요..(DX 예제처럼)

이런거 경험해 보신 분 계신가요?

조언 부탁드립니다..
 
비회원

음..

전체글 글쓴이: 비회원 » 2005-12-26 09:46

글쎄요..
관련 메세지 중에 

WM_EXITSIZEMOVE

이것이 있는데. 


이것이 안되면,
WM_ENTERSIZEMOVE
에서, 
마우스 Down 잡아서,
Up 할때, Size 시키는 꽁수? ㅡㅡ;
 
비회원

 

전체글 글쓴이: 비회원 » 2005-12-26 11:54

DX 예제처럼 만들고 싶다면 DX 예제 소스를 분석해보시면 되겠네요. ;;
 
비회원

초기화 시점에 다음 코드를 넣어보세요.

전체글 글쓴이: 비회원 » 2005-12-26 12:53

SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,FALSE,0,0);

자세한것은 MSDN에서

 

 

 

 

 

 

 

 

 

=================================

=================================

=================================

 

 

 

출처: http://blog.naver.com/PostView.nhn?blogId=luxurygag&logNo=90064259123&parentCategoryNo=&categoryNo=3&viewDate=&isShowPopularPosts=false&from=postView

 

초기화 부분에

       SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,FALSE,0,0);

삽입

 

이렇게 하면 온사이즈시 빤딱거리는 증상을 없앨 수 있다.

 

 

 

 

 

 

 

=================================

=================================

=================================

 

 

 

출처: http://www.howspace.kr/gbs/bbs/board.php?bo_table=gr2_10_data&wr_id=197

 

BOOL CTbLogDlg::OnInitDialog()

 CDialog::OnInitDialog();
 //처음시작시 onsize 실행하기 위해
 
//MoveWindow(100,100,800,530); //다이얼로그 창크기를 조정

 CRect rt;
 this->GetClientRect( rt );
 this->MoveWindow( rt );
 return TRUE;
}
void CTbLogDlg::OnSize(UINT nType, int cx, int cy)
{
 CDialog::OnSize(nType, cx, cy);
 // TODO: 여기에 메시지 처리기 코드를 추가합니다.
 if(m_LogList.GetSafeHwnd()) {
  m_LogList.SetWindowPos(NULL,0,0,cx,cy,SWP_NOZORDER);
 }
}

 

 

=================================

=================================

=================================

 

 

 

출처: https://m.blog.naver.com/PostView.nhn?blogId=microcdw&logNo=90156835943&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

 

 

다이얼로그를 늘였다 줄였다 하고 싶다..

늘였다 줄였다 하면 안에 있는 컨트롤들도 늘었다 줄었다....

 

일단

 

다이얼로그 Border 속성을 Resizing 으로 변경.

그리고 WM_SIZE 윈도우 메시지를 받는 OnSize 함수에 코드를 정의하면 끝..

 

void CResizeDlg::OnSize(UINT nType, int cx, int cy);

{

CDialog::OnSize(nType, cx, cy);

 

//컨트롤을 이동 시킬 위치 정의

if( NULL != GetDlgItem(IDOK) )

{

GetDlgItem(IDOK)->SetWindowPos(NULL, cx-40-60, cy-40, 0,0, SWP_NOSIZE | SWP_NOZORDER);

}

}

 

 

근데 이게 생각처럼 되지 않더라.....

 

하드 코딩으로 숫자를 박으면 테스트환경에서는 문제가 없는데 다른 환경에선 보장못함.....

 

그리고 조심해야 할 것은 OnSize 함수가 처음에 한번 호출 될때에는 컨트롤에 값이 할당 되어 있지않다.

그래서 NULL 체크를 해주지 않으면 다이얼로그 종료 시점에 꿱.

 

 

SetWindowPos 함수의 플래그 값에 여러가지가 있으니 잘 확인하시고 쓰길 바란다.

 

 

 

BOOL SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags);

 

 

SWP_NOSIZE                                크기는 변경하지 않고 위치만 변경. cx, cy 인수가 무시됨.

SWP_NOMOVE                              위치는 이동하지 않고 크기만 변경, x, y 인수가 무시

SWP_NOZORDER                           현재의 z순서를 유지. hWndInsertAfter 인수 무시

등등....

 

 

=================================

=================================

=================================

 

 

 

반응형


관련글 더보기

댓글 영역