Programming/C Win32 MFC2009. 6. 17. 14:58
char 형의 변수를
Format("%02X");
로 출력을 했더니 0xFFFFFFFF 이런식으로 출력이된다. OTL
내가 원한건 0xFF 이런식!


해결책 : char 형 변수를 BYTE로 선언해준다.
            BYTE는 unsigned char 형으로 선언되어 있고, 이로 인해 의도한대로 출력이 될 것이다.

[링크 : http://kuaaan.tistory.com/58]
Posted by 구차니
Programming/C Win32 MFC2009. 6. 17. 14:21
CEdit에서는 DOS 답게, CR/LF로 개행을 한다.
그런 이유인지 모르겠지만?


아무튼 multiline을 설정했을때, 개행을 하기 위해서는
"\n"이 아니라 "\r\n"을 해주어야 한다.

위는 \n
아래는 \r
Posted by 구차니
Programming/C Win32 MFC2009. 6. 17. 14:15

여기 Edit Properties에 Auto VScroll을 선택해주면 스크롤은 되는데 실제로 작동하지는 않는다.
내용이 추가 될 때 마다, 마지막 줄로 스크롤을 이동해주기 위해서는 다음의 코드를 사용하면된다.

CEdit editctrl;
int len;

len = editctrl.GetWindowTextLength();
editctrl.SetSel(len, len);

터미널 프로그램에서 처럼 일시적으로 스크롤을 하지 않게 하려면, 다른 편법이 필요 할 듯 하다.
(예를 들어 GetScrollPos 라던가 해서 가장 아래가 아니면 SetSel을 해주지 않는다던가?

[링크 : http://www.codeguru.com/forum/showthread.php?t=318921]
Posted by 구차니
Programming/C Win32 MFC2009. 6. 15. 17:25
MFC 다이얼로그에서 폰트를 수정하는 눈에 띄는 방법은
다이얼로그의 Properties를 눌러서 다이얼로그 전체의 폰트를 변경하는 것이다.




RichEditCtrl 사용해도 된다고 하지만, RichEditCtrl은 구동도 번거로운지라 다른 방법을 찾아 보게 되었다.

Step 1. CFont 변수를 Member Variable로 추가한다.(Private 추천)
Step 2. Class Wizard에서 컨트롤 변수를 선언해준다.
class CPrjNameDlg : public CDialog
{
// Construction
public:
    CFont m_fedit;

// Dialog Data
    //{{AFX_DATA(CBarcodeDlg)
    enum { IDD = IDD_DIALOG_ID };
    CEdit    m_edit;
}

Step 3. OnInitDialog() 에서 Cfont 변수를 CreateFont로 생성한다.
m_fedit.CreateFont(52, 0, 0, 0, FW_BOLD, FALSE, FALSE, 0, DEFAULT_CHARSET,
        OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS,
        "Courier New");
처음의 52는 폰트 크기, FW_BOLD는 폰트 특성(현재 굵게-Bold), 마지막의 "Courier New"는 변경할 폰트 이름이다.

Step 4. Cfont 변수를 원하는 컨트롤에 SetFont 메소드를 이용하여 설정한다.
m_edit.SetFont(&m_fedit);

주의 할 사항은, 지역 변수로 사용하면 CFont 내용이 사라지므로 커서만 커진 채 글씨가 커지지는 않는다.
[링크 : http://www.tipssoft.com/bulletin/board.php?bo_table=FAQ&wr_id=299]


참고 사항으로
한글폰트는 "~체" 라는 것들은 고정폭 폰트이다.
영문폰트는 Courier / Courier New / Lucida Console / Fixedsys 정도?

[링크 : http://www.lowing.org/fonts/]


Posted by 구차니
Programming/C Win32 MFC2009. 6. 15. 17:06

Ctrl-W 를 눌러,
클래스 위저드에서 다이얼로그 Object를 선택
Messages 에서 PreTranslateMessage를 선택하여
Add Function / Edit Code 를 한 뒤 아래의 코드를 넣어준다.


BOOL ClassName::PreTranslateMessage(MSG* pMsg)
{
     // TODO: Add your specialized code here and/or call the base class
     if(pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)
          return TRUE;
          
     return CDialog::PreTranslateMessage(pMsg);
}

[링크 : http://lafirr.tistory.com/20]
Posted by 구차니
Programming/C Win32 MFC2009. 6. 15. 10:21
PreTranslateMessage() 를 추가 후에

if(pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) return TRUE;

를 사용하면 엔터, ESC로 종료되는것을 막을 수 있다.


만약에 Editbox에서 엔터로 입력을 받아들여야 할 경우에는, 위와 같이 하면 인식을 못하게 되므로

CWnd *w;
w = GetFocus();
if (w->GetDlgCtrlID() == IDC_CTRL_ID) ...

이런식으로 특정 포커스에서 인식하도록 연결해주면 될 듯?


[링크 : http://lafirr.tistory.com/20] PreTranslateMessage
[링크 : http://www.dreamy.pe.kr/zbxe/?mid=codeclip&category=5904&document_srl=5958] PreTranslateMessage
[링크 : http://purelab.org/zbxe/?mid=guruin&page=3&document_srl=250] 서브클래싱
Posted by 구차니
Programming/C Win32 MFC2009. 6. 12. 13:47
MFC에서 RichEdit 라는 녀석이 있다.

바로 요녀석


근데, 추가하고 컴파일 하고 실행하면.. 화면이 안뜬다!!!
이유는 모르겠지만, 해결 방법은

AfxInitRichEdit();

를 적정위치에 넣어주는 것이다.
메인 프로젝트의 컨스트럭터의 TODO에 넣어 주자!

[링크 : http://bear.sage.kr/60]
Posted by 구차니
Programming/C Win32 MFC2009. 6. 9. 22:20
K&R Style
int main(int argc, char *argv[])
{
    ...
    while (x == y) {
        something();
        somethingelse();
        if (some_error)
            do_correct();
        else
            continue_as_usual();
    }
    finalthing();
    ...
}

ANSI Style(Allman Style)
while(x == y)
{
    something();
    somethingelse();
}
finalthing();

BSD KNF Style
while (x == y) {
        something();
        somethingelse();
}
finalthing();

Whitesmiths style
void MyFunc ()
    {
    while (x == y)
        {
        something();
        somethingelse();
        }
 
    finalthing();
    }

GNU Style
static char *
concat (char *s1, char *s2)
{
    while (x == y)
      {
        something ();
        somethingelse ();
      }
    finalthing ();
}

Horstmann style
while (x == y) 
{   something();
    somethingelse();
    //...
    if (x < 0)
    {   printf("Negative");
        negative(x);
    } 
    else 
    {   printf("Positive");
        positive(x);
    }
}
finalthing();



[링크 : http://en.wikipedia.org/wiki/Indent_style]
Posted by 구차니
Programming/C Win32 MFC2009. 5. 28. 21:49
일반적으로 사용하는 구조체 초기화 방법은 아래와 같다.
struct address {
                 int street_no;
                 char *street_name;
                 char *city;
                 char *prov;
                 char *postal_code;
               };

struct address temp_address =
               { 0,
                 "st. green",
                 "Hamilton",
                 "Ontario",
                 "123-456");

위의 방법은 C89 의 방법이고
C99에서는 아래와 같이 특정변수만 제한적으로 초기화가 가능하다.

struct address {
                 int street_no;
                 char *street_name;
                 char *city;
                 char *prov;
                 char *postal_code;
               };

struct address temp_address =
{ .city = "Hamilton", .prov = "Ontario" };


[링크 : http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic]
Posted by 구차니
Programming/C Win32 MFC2009. 5. 26. 23:23
libjpeg.a 라는 녀석을 발견하고는 어떻게 생겼나 궁금증이 생겼다.

$ ll libjpeg.a
-rw-r--r-- 1 root root 166012 2007-10-01 23:36 libjpeg.a

$ file libjpeg.a
libjpeg.a: current ar archive

$ nm -A libjpeg.a
libjpeg.a:jcapimin.o:00000330 T jpeg_CreateCompress
libjpeg.a:jcapimin.o:         U jpeg_abort
libjpeg.a:jcapistd.o:         U jinit_compress_master
libjpeg.a:jcapistd.o:000001b0 T jpeg_start_compress
libjpeg.a:jctrans.o:000000c0 t compress_output
libjpeg.a:jctrans.o:         U jinit_c_master_control
libjpeg.a:jcparam.o:000008a0 t add_huff_table
libjpeg.a:jcparam.o:000000e2 r bits_ac_chrominance.3846
... 파일별로 반복
'
U,T,r 등은 symbol type 이라고 하며,
위의 U는 Undefined 을, T는 Text section(code) 을 의미한다.



$ ar -t libjpeg.a
jcapimin.o
jcapistd.o
jctrans.o
jcparam.o
jdatadst.o
...


$ objdump -x libjpeg.a
In archive libjpeg.a:

jcapimin.o:     file format elf32-i386
rw-r--r-- 0/0   2296 Oct  1 23:36 2007 jcapimin.o
architecture: i386, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x00000000

Sections:
SYMBOL TABLE:
RELOCATION RECORDS FOR [.text]:
... 파일별로 반복



mangling은 컴파일러에서 이름이 중복되지 않도록 독특한 이름을 지어주는 것으로
C++에서 overloading을 지원하기 하는데 사용되기도 한다고 한다. [링크 : http://rubyeye.kr/]

int _cdecl    f (int x) { return 0; }	//	_f
int _stdcall  g (int y) { return 0; }	//	_g@4
int _fastcall h (int z) { return 0; }	//	@h@4

위키피디아에서 참조한 녀석으로 MS 컴파일러가 C언어 맹글링하는 방식의 예제이다.
[링크 : http://en.wikipedia.org/wiki/Name_mangling]

그리고 이러한 녀석을 원래이름으로 돌려주는 유틸리티로 c++filt가 존재한다.
[참고 : http://kldp.org/node/68410]


'Programming > C Win32 MFC' 카테고리의 다른 글

indent style  (0) 2009.06.09
C99 구조체 초기화 하기  (0) 2009.05.28
신기한 코드 사이즈  (0) 2009.05.19
double형을 int 형으로 출력하면?  (0) 2009.05.15
전처리기를 이용한 디버깅용 선언문(#define)  (0) 2009.05.15
Posted by 구차니