ClistCtrl 사용시 폭을 일일이 지정하기 귀찮을 때가 있다.

이 때, 사용하기 좋은 것이 있다.


m_ctrlList1.SetColumnWidth(0, LVSCW_AUTOSIZE_USEHEADER);


위 명령한줄이면 해당 컬럼 (위에서는 0번째)의 폭을 내용에 맞추어서 자동으로 줄이고 늘이고 한다.

단 위의 것을 사용할때 주의사항은 값을 리스트에 다 넣어 놓고 실행해야한다.

먼저 실행시에는 입력 하기 전의 리스트에 맞춘다. 없는경우에는 해더 크기로 맞춘다.




Posted by 훈이아제
,

MFC에서 폰트를 지정하여 사용하기 위해서 사용된다.

CFont는 가장 편하게 많이 사용되는 폰트클래스이다.

주요 함수는

CreateFont();

CreateFontIndirectA();

CreatePointFont();

CreatePointFontIndirect();

가 있다.

 

아래의 두개의 함수는

CreateFont();

CreateFontIndirectA();

일반적으로 폰트와 각 폰트의 속성을 일일이 지정하여 사용할 수 있다.

 

나머지 두개의 함수는

CreatePointFont();

CreatePointFontIndirect();

매우 간단하게 폰트를 생성하여 사용하기 편하다. 단지 2개의 변수 크기와 폰트명만 있으면 사용가능하다.

단, 기울기와 굵은글짜등의 효과는 상위 2개의 함수를 사용하여 생성하기 바란다.

 

예)

cfListFont.CreateFont(16, // 크기
                        0,
                        0,
                        0,
                        FW_SEMIBOLD, // 폰트 굵기
                        FALSE,              
                        FALSE,
                        FALSE,
                        DEFAULT_CHARSET,
                        OUT_DEFAULT_PRECIS,
                        CLIP_DEFAULT_PRECIS,
                        DEFAULT_QUALITY,
                        FF_DONTCARE,
                        _T("나눔고딕코딩")//폰트 이름

  );

GetDlgItem(IDC_EDIT_ID)->SetFont(&cfListFont);

상세하게 폰트 생성하여 설정

 

cfListFont.CreatePointFont(110,"나눔고딕코딩");
GetDlgItem(IDC_EDIT_ID)->SetFont(&cfListFont);

간단하게 폰트 생성하여 설정

 

두개의 차이는 폰트굵기를 위에는 지정하였으므로 ‘IDC_EDIT_ID’라 만든 Edit 박스의 글짜가

아래보다 굵게 나온다는 뿐이다.

Posted by 훈이아제
,

mfc 프로그램을 하면 항상 듣는 이야기가 화면 예쁘게 않되냐.

색상이 맘에 않든다.

너무 삭막하다.

이런 말이다.

기본적인 MFC의 디자인은 매우 단조롭고 평이하다.

따라서 이것들의 이미지등을 입히고 수정하는데 재일 많이 사용하는 함수가 GetDlgItem() 이다.

이 함수는 MFC 다이얼로그의 각 오브젝트를 받아와서 컨트롤 할 수 있게 도움을 준다.

간단한 예로 보였다, 안보였다 하는 역활을 할수 있다.

IDC_STACT_N1 이라는 글자 이미지가 있다하자 이것을 보였다 안보였다 하는 데는 이와 같이 사용할 수 있다.

 

// 보여주기

GetDlgItem(IDC_STACT_N1)->ShowWindows(SW_SHOW);

 

// 숨기기

GetDlgItem(IDC_STACT_N1)->ShowWindows(SW_HIDE);

 

이런식으로 많이 사용한다.

 

 

Daum 태그: ,,
Posted by 훈이아제
,

// Static 부분 글자의 색을 입히는 부분.
// static의 모양을 받아와서 다시 그리는 형태로 처리한다.
// 다른형태로 색을 표현하는 것들이 많지만 이 것이 간단한 색표현에서는 더 낳을듯하다.
CRect     sRect;
COLORREF sColor;

// IDC_STATIC_DB 에 배경을 입힌다.
// 상태에 따라서 색을 지정한다.
if ( m_iDBConnetStat == TRUE)
{
    sColor = RGB(10,180, 10);
}
else
{
    sColor = RGB(250, 10, 10);
}
// 기존 아이템을 받는다.
CStatic *pSvNameTxt = ((CStatic*)GetDlgItem( IDC_STATIC_DB ));
// 기존 아이템의 위치를 받는다.
pSvNameTxt->GetClientRect( sRect );
CClientDC cdcDBSTATE( GetDlgItem( IDC_STATIC_DB ));
// 색을 입힌다.
cdcDBSTATE.SetBkColor(sColor);
// 색을 입힌다.
cdcDBSTATE.FillSolidRect( sRect , sColor );
// 다시 그린다.
cdcDBSTATE.DrawText( theApp.m_pCfg->sDBCFG.cDbAddr , &sRect , DT_CENTER );

 

주의할 점:  최초 초기작업에서 이 부분이 제대로 처리되지 않는 경우가 발생한다. 따라서, 정상적으로 화면을 구동한 후 처리하여 기존 아이템 위에 덧씌우기 하길 바란다.

Daum 태그: ,,,,

Posted by 훈이아제
,

ListCtrl을 사용하여 List를 관리할 때 아이템은 모두 지우는 함수는 있는데.

컬럼을 모두 지우는 것은 없다.

그래서, 찾은 것 이 현 컬럼의 수를 체크하여 하나씩 지우는 수밖에 없다.

결과물)

m_ctrlLIST1.DeleteAllItems();  -- 모든 아이템 지우기
while(m_ctrlLIST1.GetHeaderCtrl()->GetItemCount() > 0)   -- 현재 컬럼의 수를 나타낸다. While문에 수 정보가 ‘0’이상이면 무조건 처리하도록 한다. 수가 0이 될때까지 While문안에서 지운다.
{
    m_ctrlLIST1.DeleteColumn(0);  -- 처음 컬럼을 지운다. 처음 컬럼을 지우면 뒤의 컬럼이 그 위치로 shift 되기 때문에 처음 컬럼만 지운다.
}

Posted by 훈이아제
,

C, C++ 에서 구조체의 저장크기가 변하는 경우가 있다.
이는 기본 구조체의 싸이즈가 정해져 있기 때문이다.
윈도우에서는 프로그램 속성에서 기본구조체를 원하는 형태로 바꾸면 된다. 그러나 그럴경우 어떠한 문제가 생길지는 기존에 사용하는 프로그램과 호환시 문제가 발생할 수 있다.( 기존프로그램에서는 변경되지 않고 사용했을 경우 서로 주고받는 Data 의 구조가 달라져서 문제가 생긴다.)
이 때, 기본 구조체의 싸이즈는 그대로 두고 현재 부분의 구조체만 변경시에는 #pragma pack 을 사용한다.

struct __TEMP_DATA_S
{
    short aaa;
    int   bbb;
}
위의 구조체를 sizeof 하여 값을 보면 8로 나온다.
우리가 생각할때는 6으로 나와야되나 기본 구조체 사이즈가 4바이트 형식이므로 맞추어 떨어지게 하기위하여 2바이트를 더하여 8바이트로 변경된다.

#pragma pack(puch, 2)   // 기본구조체사이즈를 2바이트형으로 변경한다.
struct __TEMP_DATA_S
{
    short aaa;
    int   bbb;
}
#pragma pack(pop)        // 기본구조체 사이즈를 2바이트형에서 원래의 기본 바이트로 변경한다.
으로 #pragma pack 을 추가하면 sizeof 시 값이 우리가 원하는 6으로 나온다.

참고 ----1
#pragma pack(puch, 1)   // 기본구조체사이즈를 1바이트형으로 변경한다.
struct __TEMP_DATA_S
{
    short aaa;
    char  ccc;
    int   bbb;
}
#pragma pack(pop)        // 기본구조체 사이즈를 1바이트형에서 원래의 기본 바이트로 변경한다.
----1

제 경험상으로는 PLC와 PC 와의 통신 프로그램 생성시 PC는 4바이트가 기본형이지만 PLC측은 WORD(2바이트)가 기본형이어서 문제가 많이 발생하여 그 때, 주로 사용하였습니다.

pack의 puch는 뒤의 사이즈로 변경한다는 의미.
pack의 pop은 바꾸기전의 사이즈로 변경한다는 의미.

* (VC,VC++) 와 (GCC, G++) 간에는 약간의 사용상 차이가 있을 수 있다.

Posted by 훈이아제
,

이 부분은 다로 설명이 필요 없으나 아래에 반하는 것을 하나 적어놓느다.

CString tempCS;
tempCS.Format(“ADD”);

or

char tempChar[16];
memcpy(tempChar, “ADD”, 3);
tempCS.Format(“%.3s”, tempChar);

위와같이 두가지 방법으로 Data를 넣을 수 있다.

Posted by 훈이아제
,


1. memcpy 사용하기가 가장 좋아하는 방법으로 단지 넣을 길이보다 받는 곳이 더 사이즈가 커야한다.
CString tempCS = “qwerty";
char tempChar[16];
memcpy(tempChar, &(LPCTSTR)tempCS ,tempCS.GetLength());

2. strcpy 사용하기는 함수 자체를 별로 좋아하지 않으므로 패스.
CString tempCS = “qwerty";
int length = tempCS .GetLength();
char* tempChar= new char[length];
strcpy(tempChar, tempCS.GetBuffer(0));

3. 형변환 사용하기가 있는데 이 방법은 비추 합니다.
CString tempCS = “qwerty";
char* tempChar= LPSTR(LPCTSTR(tempCS ));

4. sprintf 사용하기 또한 좋아하는 방법으로 DATA의 넣는 형식 또한 지정할 수 있어서 통신프로그램작성시 많이 사용한다. 단 받을 DATA의 최대 길이를 미리 알고 있어야 한다.
CString tempCS = “qwerty";
char tempChar[16];
sprintf(tempChar,”%.6s”,tempCS.GetString());

Posted by 훈이아제
,


포인터로 선언된 것을 초기화시  &를 붙여서 초기화하면 Data의 초기화가 아니라 포인트 어드래스를 초기화하여 Data를 입력하지 못하게한다.(입력을 못하게 하는것이 아니라 시스템 메모리 어드래스를 침범하므로 강제 종료처리가 되는것임 )

Posted by 훈이아제
,