기술 MFC 잡다한 기술 편 (Dialog 전체 화면,글자 색 변경 방법,마우스 좌표 구하기), 버튼 입력 차단하기,체크박스,글자폰트
- Dialog 전체화면 만들기
ShowWindow(SW_SHOWMAXIMIZED);
- 글자 색 변경 방법
1) 클래스 마법사에서 WM_CTLCOLOR 실행 2) 생성된 함수 OnCtlColor 에서
3) 해당 코드 입력
HBRUSH Clss_Dialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
switch (nCtlColor)
{
case CTLCOLOR_BTN:
pDC->SetBkColor(RGB(0, 0, 0));
return (HBRUSH)GetStockObject(NULL_BRUSH);
case CTLCOLOR_STATIC:
/* 변동하지 않는것 정리*/
//if (pWnd->GetDlgCtrlID() == IDC_STATIC_Title)
//{
// return hbr;
//}
pDC->SetTextColor(RGB(255, 255, 255));
pDC->SetBkColor(RGB(0, 0, 0));
return (HBRUSH)GetStockObject(NULL_BRUSH);
default:
return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}
// TODO: 기본값이 적당하지 않으면 다른 브러시를 반환합니다.
return hbr;
}
- 마우스 좌표 구하기
POINT ptOld; // previous cursor location
::GetCursorPos(&ptOld);
- 버튼 입력 차단하기
1) 클래스 마법사에서 가상함수에 PreTranslateMessage실행 2) 생성된 함수 PreTranslateMessage 에서
3) 해당 코드 입력
BOOL CDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
if (pMsg->message == WM_KEYDOWN)
{
if (pMsg->wParam == VK_RETURN) // ENTER키 눌릴 시
return TRUE;
else if (pMsg->wParam == VK_ESCAPE) // ESC키 눌릴 시
return TRUE;
else if (pMsg->wParam == VK_SPACE) // VK_SPACE키 눌릴 시
return TRUE;
}
- 체크박스 활용하기
체크박스는 클래스 마법사가 없다.
-
체크박스 UI 추가후 첫 시작 체크박스에 그룹 True 값으로 변경하기
-
메세지 기능 추가하기 ```cpp BEGIN_MESSAGE_MAP(Class_DLG, CDialogEx) … ON_CONTROL_RANGE(BN_CLICKED, IDC_RADIO_1, IDC_RADIO_2,&Class_DLG::OnRangeRadioGroup1) // ON_CONTROL_RANGE(이벤트, 첫위치, 마지막 위치,&Class_DLG::동작 함수) … END_MESSAGE_MAP()
2. 동작 함수 작성하기
```cpp
void Class_DLG::OnRangeRadioGroup1(UINT uID)
{
switch (uID)
{
case IDC_RADIO_1:
i_CheckBOx = 1; // 이벤트 내용 넣으면 된다.
break;
case IDC_RADIO_2:
i_CheckBOx = 2;
break;
}
}
참고
((CButton*)GetDlgItem(IDC_RADIO_2))->SetCheck(TRUE); 체크하기
- 리소스 가져오기
CBitmap bmp_background;
bmp_background.LoadBitmap(IDB_BITMAP_BLACK);
BITMAP bmap;
bmp_background.GetBitmap(&bmap);
int Width = bmap.bmWidth;
int Height = bmap.bmHeight;
int nChannels = bmap.bmBitsPixel == 1 ? 1 : bmap.bmBitsPixel / 8;
int depth = bmap.bmBitsPixel == 1 ? IPL_DEPTH_1U : IPL_DEPTH_8U;
BYTE *pBuffer = new BYTE[bmap.bmHeight*bmap.bmWidth*nChannels];
GetBitmapBits((HBITMAP)bmp_background.GetSafeHandle(), bmap.bmHeight*bmap.bmWidth*nChannels, pBuffer);
cv::Mat Channel4Mat(bmap.bmHeight, bmap.bmWidth, CV_MAKETYPE(depth, nChannels));
memcpy(Channel4Mat.data, pBuffer, bmap.bmHeight*bmap.bmWidth*nChannels);
cv::Mat Channel3Mat(bmap.bmHeight, bmap.bmWidth*nChannels, CV_8UC3);
// convert color
cvtColor(Channel4Mat, Channel3Mat, COLOR_BGRA2BGR);
cv::imshow("test", Channel3Mat);
cv::waitKey(0);
delete[] pBuffer;
pBuffer = NULL;
- 폴더 내부 폴더생성
#include <string.h>
#include <sys/stat.h>
#define BUFF 1024
void mkdirs(char *dir_path){
char buff[BUFF];
char *p_dir = buff; // 포인터를 문자열 처음으로
strcpy(buff, dir_path); // copy the path of the directory
buff[BUFF-1] = '\0';
while(*p_dir){
if('/'== *p_dir){
*p_dir = '\0'; // 잠시 문자열의 끝으로 설정
mkdir(buff, 0777); //
*p_dir = '/'; // 문자열 원래대로 복귀
}
p_dir ++;
}
}
- 글자 폰트 크기
CFont m_font; //전역 변수로 선언해야함
m_font.CreateFont( 100, // nHeight
80, // nWidth
0, // nEscapement
0, // nOrientation
1, // nWeight
0, // bItalic
0, // bUnderline
0, // cStrikeOut
0, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
0, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_DONTCARE, // nPitchAndFamily
"굴림" ); // lpszFacename
m_edit1.SetFont(&m_font, TRUE);
GetDlgItem(IDC_EDIT1)->SetFont(&m_font);
9. 메세지 박스 여러개 옵션
```cpp
int result = MessageBox("프로그램 종료 하시겠습니까", "알림", MB_YESNOCANCEL | MB_ICONWARNING);
if (result == IDYES)
{
::SendMessage(this->m_hWnd, WM_CLOSE, NULL, NULL);
}
else if (result== IDNO)
{
}
else if (result== IDCANCEL)
{
}
10 Postmeessage 인자 같이 보내기
문자열 인자 넘기기
CString *pstrString = new CString(strString); //new 해야함.
::PostMessage(hWnd, UM_MY_MESSAGE, (WPARAM)0, (LPARAM)pstrString);
LRESULT CMyClass::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
CString* pstrString = (CString*)lParam;
CString strString= pstrString->GetString();
//TODO : .........................
return 0;
}
11 화면 버튼 기능 막는 기능
BOOL CMFC_Camera_Dlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
if (pMsg->message == WM_KEYDOWN)
{
if (pMsg->wParam == VK_RETURN) // ENTER키 눌릴 시
return TRUE;
else if (pMsg->wParam == VK_ESCAPE) // ESC키 눌릴 시
return TRUE;
else if (pMsg->wParam == VK_SPACE) // VK_SPACE키 눌릴 시
return TRUE;
}
return CDialogEx::PreTranslateMessage(pMsg);
}
- 참고 링크
- Dialog 전체화면 만들기 관련 참고 링크 https://godtory.tistory.com/27
- 마우스 좌표 구하기 https://learn.microsoft.com/en-us/windows/win32/menurc/using-cursors
- 라디오 버튼 https://eskeptor.tistory.com/172
-
라소스 가져오기 https://ddorobot.tistory.com/entry/CBitmapBITMAP-or-HBITMAP%EC%97%90%EC%84%9C-cvMat%EC%9C%BC%EB%A1%9C-%EB%B3%80%ED%99%98
-
폴더 내부 https://m31phy.tistory.com/143
-
글자 폰트 크기 https://starfactory.tistory.com/85
-
메세지 박스 https://blog.naver.com/PostView.naver?blogId=rjseorl95&logNo=221707687230 https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messagebox
-
POSTMEAAAGE
https://seowoozzang.tistory.com/13
댓글남기기