IT 취미생활.  
Front Page
Tag | Location | Media | Guestbook | Admin   
 
'Programming'에 해당하는 글(80)
2008.07.17   다시 들쳐 보는 문법 및 레퍼함수 - fseek 2
2008.07.14   Announcing: New Google C++ Testing Framework 2
2008.07.11   [MFC] Custom Control 사용시 주의 할 점
2008.07.11   Compiler Error C2099
2008.07.09   ARC OS(?)
2008.07.07   [DshowFilter] Wince5.0을 최초 설치 후 Filter 관련 Project를 Build 시 발생하는 Error
2008.06.30   복잡한 포인터(Pointer) 읽기
2008.06.30   [MFC] Quick reference MFC Tips 54 1
2008.06.30   [VC++] GetLastError 이용한 에러 메시출력 - Win32 API
2008.06.30   [string 변환] wchar -> char char -> wchar 1
2008.06.27   "msvcrtd.lib" 링크시 문제


다시 들쳐 보는 문법 및 레퍼함수 - fseek

제목을 어떻게 붙일까하다가 "다시 들쳐 보는 문법 및 레퍼함수"이라 하였다.
특별히 fseek를 사용하는데 어려운 일이 있는 것도 아니다.

다만 가물 가물 해져가는 기억을 위해 실험하고 기록하여
이짓( IT )을 오래도록 해먹기 위한 발악쯤으로 생각 하면 될 듯...


fseek를 MSDN을 참조하면...

* 특정 위치로 파일의 포인터를 움직인다.
* 64bit를 위한 offset이 존재 한다는 것을 알 수 있다.

msdn에서 함수에 대한 설명을 볼때 가장 중요하게 볼 것은 역시,
인자 값과, 리턴 값일 것이다. 아래 내용을 잘 살펴보면

"If successful, fseek and _fseeki64 returns 0. Otherwise, it returns a nonzero value. "
성공과 실패에 대한 return 값을 정의하고 있다.

MSDN을 살펴보면 친절하게도 예제 코드도 제공 해준다.
굿이다.

Moves the file pointer to a specified location.

int fseek( 
   FILE *stream,
   long offset,
   int origin 
);
int _fseeki64( 
   FILE *stream,
   __int64 offset,
   int origin 
);

Parameters

stream

Pointer to FILE structure.

offset

Number of bytes from origin.

origin

Initial position.

If successful, fseek and _fseeki64 returns 0. Otherwise, it returns a nonzero value. On devices incapable of seeking, the return value is undefined. If stream is a null pointer, or if origin is not one of allowed values described below, fseek and _fseeki64 invoke the invalid parameter handler, as described in Parameter Validation. If execution is allowed to continue, these functions set errno to EINVAL and return -1.

The fseek and _fseeki64 functions moves the file pointer (if any) associated with stream to a new location that is offset bytes from origin. The next operation on the stream takes place at the new location. On a stream open for update, the next operation can be either a read or a write. The argument origin must be one of the following constants, defined in STDIO.H:

SEEK_CUR

Current position of file pointer.

SEEK_END

End of file.

SEEK_SET

Beginning of file.

You can use fseek and _fseeki64 to reposition the pointer anywhere in a file. The pointer can also be positioned beyond the end of the file. fseek and _fseeki64 clears the end-of-file indicator and negates the effect of any prior ungetc calls against stream.

When a file is opened for appending data, the current file position is determined by the last I/O operation, not by where the next write would occur. If no I/O operation has yet occurred on a file opened for appending, the file position is the start of the file.

For streams opened in text mode, fseek and _fseeki64 have limited use, because carriage return–linefeed translations can cause fseek and _fseeki64 to produce unexpected results. The only fseek and _fseeki64 operations guaranteed to work on streams opened in text mode are:

  • Seeking with an offset of 0 relative to any of the origin values.
  • Seeking from the beginning of the file with an offset value returned from a call to ftell when using fseek or _ftelli64 when using _fseeki64.

Also in text mode, CTRL+Z is interpreted as an end-of-file character on input. In files opened for reading/writing, fopen and all related routines check for a CTRL+Z at the end of the file and remove it if possible. This is done because using the combination of fseek and ftell or _fseeki64 and _ftelli64, to move within a file that ends with a CTRL+Z may cause fseek or _fseeki64 to behave improperly near the end of the file.

When the CRT opens a file that begins with a Byte Order Mark (BOM), the file pointer is positioned after the BOM (that is, at the start of the file's actual content). If you have to fseek to the beginning of the file, use ftell to get the initial position and fseek to it rather than to position 0.

This function locks out other threads during execution and is therefore thread-safe. For a non-locking version, see _fseek_nolock, _fseeki64_nolock.

Function Required header Compatibility

fseek

<stdio.h>

ANSI, Windows 95, Windows 98, Windows 98 Second Edition, Windows Millennium Edition, Windows NT 4.0, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003

_fseeki64

<stdio.h>

Windows 95, Windows 98, Windows 98 Second Edition, Windows Millennium Edition, Windows NT 4.0, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003

For additional compatibility information, see Compatibility in the Introduction.

// crt_fseek.c
// This program opens the file FSEEK.OUT and
// moves the pointer to the file's beginning.
 
#include <stdio.h>

int main( void )
{
   FILE *stream;
   char line[81];
   int  result;

   if ( fopen_s( &stream, "fseek.out", "w+" ) != 0 )
   {
      printf( "The file fseek.out was not opened\n" );
      return -1;
   }
   fprintf( stream, "The fseek begins here: "
                    "This is the file 'fseek.out'.\n" );
   result = fseek( stream, 23L, SEEK_SET);
   if( result )
      perror( "Fseek failed" );
   else
   {
      printf( "File pointer is set to middle of first line.\n" );
      fgets( line, 80, stream );
      printf( "%s", line );
    }
   fclose( stream );
}

Output

File pointer is set to middle of first line. This is the file 'fseek.out'.


Announcing: New Google C++ Testing Framework

최근 RSS를 사용하고 있습니다. RSS의 약자는  Really Simple Syndication(매우 간단한 배급)이라는
뜻을 가지고 있습니다. RSS가 어떤 기능을 하고 있을까? 생각 해보면, 그 옛날 ~
메일링 리스트와도 같은 역활을 합니다. ^^

제가 Outlook 2007을 사용하며, RSS의 기능을 적극 활용하고 있습니다.
새로운 글이 포스팅이 되었을때 RSS를 통해서 메일을 받아 볼 수 있습니다.

웹 블로그나 홈페이지를 일일히 방문하지 않아도 됩니다.
outlook을 통해서 새롭게 포스팅 된 글을 읽으면 됩니다.

RSS의 장점으로 꼽는다면...

1. 시간절약
2. 각 블로거 님들마다 기사가 정리 됩니다.
3. 원클릭으로 원본 글을 읽을 수 있습니다.

서두가 길었습니다.


오늘은 구글의 Google C++ Testing Framework에 대해서 알아 보도록 하겠습니다.
제가 RSS를 통해서 알게된  google의 " Testing Blog"입니다.



오늘 우리가 알아 보려는 Testing Framework 입니다.
아래 링크를 읽어 보시면 좋을 것 같습니다.

Introduction: Why Google C++ Testing Framework?


저는 npteam블로그에서 Google Testing과 관련된 글을 읽었습니다.
http://www.npteam.net/656    <--- vs2005에서 돌아가는 샘플을 얻을 수 있습니다.


업무 시간이라 글을 대 허접하게 올려 놨군요.
항상 글을 쓸때,  완성도 있는 글을 써야겠다 마음 먹지만 잘 안되는군요.
(시간이 없다는 핑게로요..)




[MFC] Custom Control 사용시 주의 할 점
문제 해결....

해당 Custom Control을 이용시 해당 Class 이름을 연결 해주어야 합니다.
이것을 몰랐네요 ㅜ0ㅜ


봉착 했던 문제
단순히 Resource View에 Custom Control을 추가 하고 프로그램을 실행 하는
것만으로도 아래와 같은 Output을 내보내며 프로그램이 실행 조차도 안된다.


실제 디버깅을 하여 따라가보면
OnInitialD~ () 들어 오지 않는다 헐...
왜 그럴까????

한참 고민하고 비스타 문제인가? 생각되어 회사 선배의 노트북에서
체크(vs 2008)를 해봤으나 역시 마찬가지 아래와 같은 메시지 뿐....

XP에서도 마찬가지였다.
오랜만에 찾은 데브피아 ~ !!
럭키 문제는 Custom Control을 사용할때 해당 Class 명을  연결 해줘야 한다는 것이다.

내가 UI 프로그래밍이 많이 약한 것을 잘 알고 있다.
ㅜ..ㅜ 너무 싫은게 아니라 모르는게 많은 것이다.
매일 매일 갱생이 필요 할 듯 하다.



Detected memory leaks!
Dumping objects ->
f:\sp\vctools\vc7libs\ship\atlmfc\src\mfc\occmgr.cpp(195) : {71} normal block at 0x01718248, 8 bytes long.
 Data: <        > E9 03 00 00 00 00 00 00
{70} normal block at 0x01718200, 8 bytes long.
 Data: <        > FF FF FF FF 00 00 00 00
Object dump complete.
The program '[3568] MultiListApplication.exe: Native' has exited with code 0 (0x0).


Compiler Error C2099

Error Message

initializer is not a constant

This error is issued only by the C compiler and occurs only for non-automatic variables. The compiler initializes non-automatic variables at the start of the program and the values they are initialized with must be constant.

Example

The following sample generates C2099.

// C2099.c
int j;
int *p;
j = *p; // C2099 *p is not a constant

C2099 can also occur because the compiler is not able to perform constant folding on an expression under /fp:strict because the floating point precision environment settings (see _controlfp_s for more information) may differ from compile to run time.

When constant folding fails, the compiler invokes dynamic initialization, which is not allowed in C.

To resolve this error, compile the module as a .cpp file or simplify the expression.

For more information, see /fp (Specify Floating-Point Behavior).

The following sample generates C2099.

// C2099_2.c
// compile with: /fp:strict /c
float X = 2.0 - 1.0;   // C2099
float X2 = 1.0;   // OK


Also See - C/C++ Build Errors

http://msdn.microsoft.com/en-us/library/8x5x43k7(VS.80).aspx



ARC OS(?)

ARC: Enabling the Multimedia Revolution

ARC International (LSE: ARK) is fueling the multimedia revolution by enabling high quality multimedia content to be captured, shared, and played on a wide variety of consumer electronics devices.  ARC licenses award-winning consumer intellectual property (IP) in the form of multimedia subsystems and related technologies to semiconductor and OEM companies worldwide.  They enable customers to create differentiated silicon chips that deliver an enhanced multimedia experience to consumers.  Sonic Focus, an ARC International company, licenses award-winning audio enhancement software bringing the consumer closer to the original artist’s performance.

http://www.arc.com/


통합 개발툴 :
MetaWare IDE : http://www.arc.com/software/development/metawareides.html



오늘은 젤리를 ARC OS에서 동작 하도록 포팅을 하였다.
(젤리는 방송용 미들웨어로 회사 솔루션이다. )
일단 Jelly를 빌드하는데 문제가 없었는데, 컴파일러 자체가 유연하여 별다른 LinkError가 없었다.
(Linux로 포팅시에 대/소문자에서 부터 애를 먹었다. 1박 2일 )
실제 개발환경 설치하고 하는 시간빼고, 대략 1시간 내에 빌드 완료.

테스트 코드를 작성하는데 문제 봉착 : Thread는 어케 생성해 ? Task? 라도 있어?
loop 돌고 있는중...

ARC OS에 대해서 정보가 있으면, 자료를 공유 부탁 드립니다.


[DshowFilter] Wince5.0을 최초 설치 후 Filter 관련 Project를 Build 시 발생하는 Error
C:\WINCE500\PUBLIC\DIRECTX\SDK\INC\ctlutil.h(289) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int


F4를 눌러서 에러가 나는 부분으로 뛰면
ctlutil.h 파일 228 Line에서 Error 발생
오리지널
private:
    //  Prevent bugs from constructing from LONG (which gets
    //  converted to double and then multiplied by 10000000
    COARefTime(LONG);
    operator=(LONG);   //  <------ Check Here
};

변경
private:
    //  Prevent bugs from constructing from LONG (which gets
    //  converted to double and then multiplied by 10000000
    COARefTime(LONG);
    LONG operator=(LONG);   //  <------ Check Here
};



일단 에러를 회피 하자.!


복잡한 포인터(Pointer) 읽기
제가 종종 들리는 신영진님의 "지니야 넷"에서 훔쳐 온 글입니다.
원문 그대로 옮겼습니다. 트랙백을 통해서 글을 연결하고 싶지만,,,,,;;,,,,

원문이 없어지는(?) 일이 종종 있어서 아쉬운 마음에 담아왔습니다.
널은 아량으로 용서를 빕니다. ~

복잡한 포인터를 읽는 법에 대해서 잘 설명을 해주셨습니다.
좌에서 우로~ 3가지의 표현을 영어로 해석하게 되면
아무리 복잡한 포인터라도 의미를 쉽게 알 수 있습니다.

팀내 친한 선배님(이의진 책임님)은 안에서 "원을 그리며 읽어라"라고 하셨습니다.
거의 일맥 상통한다 볼 수 있습니다.

저도 또한 포인터를 많이  사용합니다.
Callback Function을 주로 사용하거나, Struct에 Fucntion Pointer member를 이용하여
구조체 자체를 넘기기도 하고, 2차 배열 동적할당을 위해서 사용하기도 합니다.

포인터는 어려운 것이 아닙니다. 다만 프로그래밍을 싫어하는(?) 선배들에 의해서
포인터가 어렵데 어렵데라는 말에 벌써 벌벌 떨진 않았나 돌아 봅니다.

포인트를 이해 하기위해서는 약간의 자기만의 이해 방법이 있어야 하고 ~
도서관에서 얇은 책을 보고도 포인터를 알 수도 있습니다.
알려고 노력 했을 경우 입니다. ^^

혹시 포인터 말고도 더 많은 지식을 얻고자 한다면 아래 신영진 님의 싸이트를
방문 해보시면 ..^^ 살이 되고 피가 되는 좋은 내용들을 얻을 수 있을 것입니다.

그럼 고운하루 되세요~!



신입 개발자를 위한
복잡한 포인터 선언을 해석하는 방법
신영진 pop@jiniya.net http://www.jiniya.net

C언어 게시판에 자주 올라오는 질문 중에 하나가 복잡한 포인터 선언문을 해석하는 것들이다. 대부분의 학생들은 이것을 막연히 외우려고 한다. int *a[3]은 int 포인터를 저장하는 배열이고, int (*a)[3]은 int 배열에 대한 포인터라고 외우는 것이다. 하지만 이렇게 외운 지식은 그 형태가 조금만 달라져도 무용지물이 된다. 그렇다면 어떻게 해야 이러한 선언문을 손쉽게 해석할 수 있을까? 간단한 규칙만 이해하면 된다.

복잡한 선언을 정확하게 이해하기 위한 첫 단계는 선언문 내부에 나타나는 각 요소의 정확한 의미를 이해하는 것이다. <표 1>에는 선언문 내부에 나타나는 각 구성요소의 의미와 사용 예가 나와있다. 선언문을 해석할 때 영어를 이용하면 굉장히 편리하게 해석할 수 있다. 따라서 각 기호에 맞는 영어 표현도 같이 알아두는 것이 좋다.

표 1 표현식에 나타나는 기호들의 의미

기호

표현

의미

*

pointer to

특정 대상체를 가리키는 포인터

int *a;

a int 형을 가리키는 포인터다.

[]

array of

특정 대상체를 저장하는 배열

int a[3];

a int 3개 저장할 수 있는 배열이다.

()

function

인자를 받고 값을 리턴하는 함수

int a();

a는 인자가 없고 int를 반환하는 함수다.


다음으로 이해해야 하는 것은 선언문을 해석하는 순서다. 선언문은 선언 대상이 되는 변수 명에서 시작해서 오른쪽으로 가면서 해석한다. 선언문의 끝이나 오른쪽 괄호를 만나면 방향을 바꾸어 왼쪽으로 가면서 해석한다. 왼쪽으로 가면서 해석을 하다 왼쪽 괄호를 만나면 다시 오른쪽으로 가면서 해석한다. 이렇게 해서 선언문의 가장 왼쪽 끝에 도달하면 해석이 마무리 된다.

표 2 복잡한 표현식들의 해석 순서와 해석 결과

표현식

해석 순서

해석 결과

int **a;

 

a => a; => *a; => **a; => int **a;

a is a pointer to pointer to int

a int를 가리키는 포인터의 포인터다.

int *a[3];

 

a => a[3] => a[3]; => *a[3]; => int *a[3];

a is an array of 3 pointer to int

a int를 가리키는 포인터를 세 개 저장하는 배열이다.

int (*a)[3];

 

a => a) => (*a) => (*a)[3] => int (*a)[3]

a is a pointer to array of 3 int

a int 세 개를 저장하고 있는 배열을 가리키는 포인터다.

int *(*(*fp1)(int))[10];

fp1 => fp1) => (*fp1) => (*fp1)(int) => (*fp1)(int)) => (*(*fp1)(int)) => (*(*fp1)(int))[10] => *(*(*fp1)(int))[10]; = > int *(*(*fp1)(int))[10];

fp1 is a pointer to function that takes an int as an argument and returns a pointer to an array of 10 pointers to ints.

fp1 int를 인자로 받고 int에 대한 포인터를 열 개 저장하는 배열을 가리키는 포인터를 리턴하는 함수에 대한 포인터다.

char *(*(**foo[][8])())[];

foo[] => foo[][8] => *foo[][8] => (**foo[][8]) => (**foo[][8])() => *(**foo[][8])() => (*(**foo[][8])())[] => char *(*(**foo[][8])())[]

foo is an array of array of 8 pointers to pointer to function that returns a pointer to array of pointer to char.

foo char를 가리키는 포인터를 저장하는 배열을 가리키는 포인터를 리턴하는 함수에 대한 포인터를 가리키는 포인터를 8개 저장할 수 있는 배열에 대한 배열이다.




[MFC] Quick reference MFC Tips 54

1. DC얻기

  CClientDC dc(this);


2. Client 영역 구하기

  GetClientRect(&rect);

  WM_SIZE 메시지발생후 cx,cy 사용


3. 문자열 사각형안에 그리기

  pDC->DrawText(문자열,사각형,Style);

  Style : DT_BOTTOM - 문자열을 사각형 맨아래줄에배열 반드시DT_SINGLELINE과 함께사용

            DT_CENTER - 문자열을 가로중앙에 배치

            DT_VCENTER - 문자열을 세로중앙에 배치

            DT_LEFT,RIGHT - 문자열을 좌,우로 배치

            DT_SINGLELINE - 문자열을 한줄로만 쓴다


4. Brush 사용법

  CBrush brushname(RGB(red,green,blue)); //브러쉬 생성

  //이전Brush 저장, 새로운 Brush 선택

  CBrush *oldBrush=pDC->SelectObject(&brushname);

  pDC->SelectObject(oldBrush); //원래의 브러쉬로 반환


5. Pen사용법

  CPen pen(Pen Style,RGB(red,green,blue)); //브러쉬생성

  //Style: PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_GEOMETRIC,PS_COSMETRIC

                - 펜종류

              PS_ENDCAP_ROUND,PS_ENDCAP_SQUARE - 펜끝을 둥글게,각지게 설정

  CPen *oldPen=pDC->SelectObject(&pen); //이전Pen저장, 새로운 Pen설정

  pDC->SelectObject(oldPen); //펜반환


6. 화면다시그리기

  View Class에서 - Invalidate(TRUE) : 화면을 지우고다시그린다

                            Invalidate(FALSE) : 화면을 덮어씌운다

  UpdateAllViews(NULL);  // Doc Class에서 View 의 OnDraw 호출

  RedrawWindow();


7. 메시지,함수 수동으로 넣기 (EX)버튼클릭함수넣기

  헤더파일의 AFX_MSG_MAP 부분에 함수를 정의

  // .cpp파일의 AFX_MSG 부분에 메시지를 추가한다

  EX) afx_msg void funcName();

  // ID 등록:  View 메뉴의 Resource Symbol 에 들어가서 메뉴 ID 를 등록해준다..

  EX) ON_BN_CLICKED(ID_NAME,funcName).

  // .cpp파일의 맨아래에서 함수를 정의한다

  EX) void CClass::funcName() { ... }


8. 마우스커서 바꾸기

  리소스탭에서 커서를 그리고 저장한뒤 ID값은 준다음

  SetCapture(); //커서의입력을 클라이언트영역을 벗어나더라도 받아낸다

  SetCursor(AfxGetApp()->LoadCursor(nIDResource));

  //APP클래스의 LoadCursor View의 SetCursor 사용

  ReleaseCapture(); //SetCursor()상태를 해제한다


9. 색상표 사용하기

  CColorDialog dlg;

  if(dlg.DoModal()==IDOK) //Dialog 를 띄운후 OK버튼을누르면 실행할부분

  MemberFunc: GetColor() //선택된 색상을 받아온다 return 형은 COLORREF 형


10. 팝업메뉴 만들기

  CMenu menu; //메뉴 객체생성

  CMenu *pmenu; //메뉴 포인터생성

  menu.LoadMenu(IDR_MAINFRAME); //메뉴를 불러온다

  pmenu=menu.GetSubMenu(3); //메뉴의 3번째 메뉴를 가져온다

  menu.CheckMenuItem(ID_MENU,m_kind==ID_MENU ? MF_CHECKED : MF_UNCHECKED); //메뉴 체크하기 (메뉴 ID, ID 체크조건)

  pmenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this) //(TMP_Style,x좌표,y좌표,hWnd) 메뉴 띄우기


  *주의사항*

  [안내]태그제한으로등록되지않습니다-OnContextMenu(CWnd* pWnd, CPoint point)  //여기서 point 는 스크린 기준이고,

  OnRButtonDown(UINT nFlags, CPoint point)  //여기서 point 는 클라이언트 기준이다!


11. 클라이언트 포인터를 스크린 포인터로 변경

  ClientToScreen(&point);


12. 그림판기능

  if(m_flag==FALSE)  return;   //m_falg=그리기 기능 참,거짓설정  그리기 아니면 빠져나간다

        CClientDC dc(this);

        CPen myPen(PS_SOLID,m_width,m_color);

        CPen *pOldPen=dc.SelectObject(&myPen);

        switch(m_shape)

        {

        case ID_FREELINE: //자유선그리기

                dc.MoveTo(m_oldpt.x,m_oldpt.y); //지난포인터부터

                dc.LineTo(point.x,point.y); //새포인터까지 그린다

                break;

        case ID_RECT: //사각형그리기

                dc.SetROP2(R2_NOTXORPEN);

                dc.Rectangle(m_spt.x,m_spt.y,m_oldpt.x,m_oldpt.y);  //지워지는 효과

                dc.Rectangle(m_spt.x,m_spt.y,point.x,point.y); //그려지는 효과

                break;

        case ID_ELLIPSE: //원그리기

                dc.SetROP2(R2_NOTXORPEN);

                dc.Ellipse(m_spt.x,m_spt.y,m_oldpt.x,m_oldpt.y);  //지워지는 효과

                dc.Ellipse(m_spt.x,m_spt.y,point.x,point.y); //그려지는 효과

                break;

        case ID_LINE: //선그리기

                dc.SetROP2(R2_NOTXORPEN);

                dc.MoveTo(m_spt.x,m_spt.y); //시작점부터

                dc.LineTo(m_oldpt.x,m_oldpt.y); //지난점까지 그은선을 지운다

                dc.MoveTo(m_spt.x,m_spt.y); //시작점부터

                dc.LineTo(point.x,point.y); //새로운점까지 그린다

                break;

        }

        m_oldpt=point;  //바로이전값 보관

        dc.SelectObject(pOldPen); //펜 반환


13. MessageBox

  AfxMessageBox()->전역함수를 이용하영 메세지 박스를 출력한다.   //어디서든지 사용할수 잇다

  int CWnd::MessageBox("메세지","창제목","아이콘|버튼(상수값)");   //View클래스에서 사용한다

  아이콘 상수값  MB_IC[안내]태그제한으로등록되지않습니다 - xxONERROR,  

                MB_ICONWARNING, MB_ICONQUESTION,MB_ICONINFOMATION

                MB_SYSTEMMODAL //시스템모달 대화창 닫기전에 다른작업 못함

                MB_APPLMODAL //응용모달

  버튼 상수값    MB_OK, MB_OKCANCEL, MB_YESNO


14. OS 컨트롤

  ExitWindowEx(EWX_SHUTDOWN,NULL); //Shut Down

  ExitWindowsEx(EWX_FORCE,0); //강제종료

  ExitWindowsEx(EWX_LOGOFF,0); //로그오프

  ExitWindowsEx(EWX_POWEROFF,0); //Shut Down -> Turn Off

  ExitWindowsEx(EWX_REBOOT); //Shut Down -> Reboot


15. DialogBox 메시지 교환

  UpdateData(FALSE); // 컨트롤에 멤버변수의 내용을 표시해준다

  UpdateData(TRUE);  // 컨트롤 내용을 다이얼로그 클래스의 멤버변수로 저장


16. 자료변환

  atoi,itoa - int <=> ASCII(char) 변환

  str.Format(" %d %d",x,y); // int형을 문자열로 변환

  atol,ltoa - ASCII <=> long 변환

  atof - ACSII => float 변환

  fcvt,gcvt  - 실수를 text로 변환

  LPtoDP, DPtoLP - 장치좌표 <=> 논리좌표 변환


17. CEdit Class 사용하기

  CEdit e_str.SetSel(int StartChae, int EndChar); //처음문자부터 마지막까지 블록 지정

  CEdit e_str.GetSel(int SChar,int EChar); //블럭 지정한 처음문자와 마지막문자 받기

  CString str=m_str.Mid(SChar,EChar-SChar); //블럭지정한 부분을 가져온다


18. 컨트롤과 자료교환

  SetDlgItemText(컨트롤 ID,문자열) //컨트롤에 문자열을 넣는다

  GetDlgItemText(컨트롤 ID,문자열) //컨트롤의 내용을 문자열에 넣는다

  GetDlgItem(컨트롤 ID); //컨트롤의 주소를 가져온다


19. 상태바조작

  CMainFrame 생성자 위에

  static UINT indicators[] = //이안에 새로운 ID를 넣고 그 ID의 갱신핸들러를 만든다음 코딩

  pCmdUI->SetText("표시할내용“);


20. 수동으로 Bitmap 컨트롤 사용하기

  CStatic bitmap; //bitmap 컨트롤변수

  bitmap.SetBitmap(CBitmap m_bitmap); //컨트롤에 비트맵지정

  GetDlgItem(IDC_BITMAP)->ShowWindow(SW_SHOW,HIDE);  // 그림을 보이거나 숨긴다.

  

21. 응용프로그램 실행하기

  WinExec("프로그램경로“,SW_SHOW,HIDE); //응용프로그램실행,경로는 \\로 구분한다


22. Bitmap 사용하기

  CBitmap bitmap.LoadBitmap(IDC_BITMAP); //비트맵객체에 비트맵지정

  CDC memDC; //그림그릴 메모리DC생성

  MemDC.CreateCompatibleDC(pDC); //화면 DC와 메모리 DC 호환 생성

  CBitmap *pOldBitmap=MemDC.SelectObject(&m_bitmap); //메모리에 그림을그린다.

  pDC->BitBlt(int x, int y,int Width, int Height, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop);

//BitBlt(그림x좌표,그림y좌표,그림넓이,그림높이,그림그려진메모리DC,그림시작x좌표,그림시작y좌표,스타일);

  pDC->StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop )

//StretchBlt(그림x좌표,그림y좌표,그림넓이,그림높이,그림그려진메모리DC,그림x좌표,그림y좌표,메모리그림넓이,메모리그림높이,스타일);

MemDC.SelectObject(pOldBitmap); // 메모리DC반환


23. Font 바꾸기

  CFontDialog dlg;//폰트다이얼로그 생성

  LOGFONT m_logFont; //폰트받을변수선언

  if(dlg.DoModal()==IDOK) //폰트다이얼로그표시

  {dlg.GetCurrentFont(&m_logFont)} //선택된 폰트받기

  OnDraw()

   CFont newFont,*pOldFont; //폰트 객체 만들기

   newFont.CreateFontIndirect(&m_logFont); //폰트 생성

   pOldFont=(CFont *)pDC->SelectObject(&newFont); //폰트 선택

   OnCreate()

   CClientDC dc(this); //DC 생성

   CFont *pFont=dc.GetCurrentFont();        //클라이언트 영역의 폰트를

   pFont->GetLogFont(&m_logFont); //로그폰트 멤버값으로 지정


24. Font 만들기

         LOGFONT logfont; //폰트를 만든다

        logfont.lfHeight=50;               //문자열 높이

        logfont.lfWidth=0;                 //너비

        logfont.lfEscapement=0;            //문자열기울기

        logfont.lfOrientation=0;             //문자개별각도

        logfont.lfWeight=FW_NORMAL;     //굵기

        logfont.lfItalic=TRUE;             //이탤릭

        logfont.lfUnderline=TRUE; //밑줄

        logfont.lfStrikeOut=FALSE; //취소선

        logfont.lfCharSet=HANGUL_CHARSET; //필수

        logfont.lfOutPrecision=OUT_DEFAULT_PRECIS;               

        logfont.lfClipPrecision=CLIP_DEFAULT_PRECIS;     //가변폭폰트 고정폭폰트

        logfont.lfPitchAndFamily=DEFAULT_PITCH|FF_SWISS; //글꼴이름

        strcpy(logfont.lfFaceName,"궁서체");

        CClientDC dc(this);

        CFont newFont; //폰트객체생성

        newFont.CreateFontIndirect(&logfont); //폰트지정

        CFont *pOldFont=dc.SelectObject(&newFont); //폰트선택

        dc.TextOut(100,100,m_text);

        dc.SelectObject(pOldFont); //폰트반환


25. Font 만들기 2

  CFont newFont;

  newFont.CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFacename );

 CFont *pOldFont=dc.SelectObject(&newFont);


26. ComboBox 사용하기

  CComboBox combo; //콤보박스 선언

  combo.Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

  //Style - WS_CHILD|WS_VISIBLE

  int n=combo.GetCurSel(); //선택된 아이템의 index를 가져온다

  combo.AddString("문자열“); //문자열을 추가한다

  combo.GetLBText(n,str); //n번째 아이템을 str에 저장


27. Spin 사용하기

  Spin은 바로앞의 Tab Order에 따라 붙는다

  m_spinr.SetRange(1900,3000); //스핀 범위 지정

  m_spinr.SetPos(m_nYear); //스핀 위치 지정


28. CTime사용하기

  CTime time; //시간객체생성

  time=CTime::GetCurrentTime(); //현재시간을 저장

  time.GetYear(),time.GetMonth();,time.GetDay(),time.GetHour(),time.GetMinute(),time.GetSecond()


29. CListBox 메소드

  AddString("문자열");             //리스트에 문자열 추가

  DeleteString(index);             //리스트에서 항목 삭제

  GetCount()                     //전체 항목 갯수를 얻는다.

  GetSelcount()                   //선택된 항목 갯수 리턴

  GetSel()                //선택된 것인지 아닌지를 리턴한다 -> 양수 = TRUE , 음수 => FALSE

  GetText(int index,문자열변수)     //index 번째 문자열을 문자열 변수에 넣는다

  FindStringExact(문자열)    //지정 문자열의 index 값 리턴 -> 없으면 리턴값 LB_ERR 반환

  FindString("a")               //"a"로 시작하는 항목을 모두 찾는다.

  ResetCountent()            //모든 내용을 지운다.


30. 파일입출력

  프로젝트생성시 Step4 => Advanced => 저장파일확장자지정

  //이 클래스를 저장,로드가능한 클래스로 쓰겟다는 선언

  .h 파일에       DECLARE_SERIAL(CSawon)  

  .cpp 파일에     IMPLEMENT_SERIAL(CSawon,CObject,1) //이거를 해야 저장이 가능하다

  void CFileioDoc::Serialize(CArchive& ar)

        if (ar.IsStoring()) 

        {

            ar< <             //저장하기

        }

        else    //열기

        {

             ar>>m_shape; //불러올걸 쓴다. 읽을때도순서대로읽어야한다

        }



31. MicroSoft FlexGrid 사용하기!

  CMSFlexGrid m_Grid; //FlexGrid 컨트롤 변수

  CString strTitle[]={"고객코드","고객성명","고객포인트","신장","몸무게","고객등급","BMT지수","판정결과"}; // Grid 의 제목에 넣을문자배열

  int Width[]={900,900,1100,800,800,900,1000,900}; // Grid 의 열넓이 지정할 배열

  m_Grid.SetRows(m_cnt+2); //전체행수 지정

  m_Grid.SetCols(8);//전체열수 지정

  m_Grid.Clear(); //지우기

  m_Grid.SetFixedCols(0); //고정열은 없다.

  m_Grid.SetRow(0); // 행선택

  for(int i=0;i<=7;i++)

  {

     m_Grid.SetColWidth(i,Width[i]); //열 넓이 설정

     m_Grid.SetCol(i); //열 선택

     m_Grid.SetText(strTitle[i]); // 선택된행, 선택된열에 Text 를 넣는다

  }


32. 4대 Class간 참조

  //각각 헤더파일 include

  #include "MainFrm.h" //메인프레임 헤더파일

  #include "ClassDoc.h"   //Doc클래스 헤더파일

  #include "ClassView.h" //View를 include 할때는 반드시 Doc 헤더파일이 위에잇어야한다

  #include "Class.h" //APP Class 의 헤더파일


  void CClassView::OnMenuView() //뷰클래스

    CClassApp *pApp=(CClassApp *)AfxGetApp();   //View -> App
    CMainFrame *pMain=(CMainFrame *)AfxGetMainWnd();  //View -> MainFrm

    //View -> MainFrm -> Doc

    CClassDoc *pDoc=(CClassDoc *)pMain->GetActiveDocument();

    CClassDoc *pDoc=(CClassDoc *)GetDocument();        //View -> Doc


    //MainFrame 클래스

    CClassView *pView=(CClassView *)GetActiveView();  //MainFrm -> View

    CClassDoc *pDoc=(CClassDoc *)GetActiveDocument();  //MainFrm -> Doc

    CClassApp *pApp=(CClassApp *)AfxGetApp(); //MainFrm -> App


    //Doc 클래스

    CClassApp *pApp=(CClassApp *)AfxGetApp(); //Doc -> App

    CMainFrame *pMain=(CMainFrame *)AfxGetMainWnd(); //Doc -> MainFrm

    // Doc -> MainFrm -> View

    CClassView *pView=(CClassView *)pMain->GetActiveView();

    CClassView *pView=(CClassView *)m_viewList.GetHead();      // Doc -> View


    //App 클래스

    CMainFrame *pMain=(CMainFrame *)AfxGetMainWnd(); //App -> MainFrm

    //App -> MainFrm -> View

    CClassView *pView=(CClassView *)pMain->GetActiveView();

    //App -> MainFrm -> Doc

    CClassDoc *pDoc=(CClassDoc *)pMain->GetActiveDocument();


33. ToolBar 추가하기

  CMainFrame 으로 가서 멤버변수 추가

  CToolBar m_wndToolBar1;

  OnCreate 로 가서 다음 내용을 추가해준다

  (위의 toolbar 부분을 복사하고 이름만 바꾸면 된다.3군데..)

  if (!m_wndToolBar1.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE |

         CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY |

         CBRS_SIZE_DYNAMIC) || !m_wndToolBar1.LoadToolBar(IDR_TOOLBAR1))

        {

                TRACE0("Failed to create toolbar\n");

                return -1;      // fail to create

        }


  그 함수내에서 //TODO 아래에 내용추가..역시..복사해서 이름만 바꾸면 된다.

        m_wndToolBar1.EnableDocking(CBRS_ALIGN_TOP|CBRS_ALIGN_BOTTOM);

        //DockControlBar(&m_wndToolBar1);   <= 이부분 대신..

        이거를 넣는다..

        CRect toolRect; //툴바 영역을 얻을 사각형

        this->RecalcLayout(); //현상태의 Client 영역을 구해서 저장한다

        m_wndToolBar.GetWindowRect(&toolRect); //툴바영역을 저장한다

        toolRect.left+=1; //사각형의 왼쪽을 1Pixel 줄인다

        //ToolRect에 툴바를 붙인다

        DockControlBar(&m_wndToolBar1,AFX_IDW_DOCKBAR_TOP,&toolRect);

        return 0;


34. ToolBar에 ComboBox붙이기

  CComboBox m_combo; //객체생성

  ID 등록 => view 메뉴 => resource symbol => new => ID_COMBO

  oncreate 에 내용 추가 (콤보를 만들고 표시하는 내용)

        m_wndToolBar.SetButtonInfo(10,IDC_COMBO,TBBS_SEPARATOR,150); 

        //툴바의 10번째버튼을 편집한다

        CRect itemRect; //콤보를넣을 사각형을 만든다

        m_wndToolBar.GetItemRect(10,&itemRect); //툴바의 10번째 버튼을 사각형에 넣는다
        itemRect.left+=5; //앞여백

        itemRect.right+=5; //뒤여백

        itemRect.bottom+=100; //콤보가열릴 공간확보

        m_combo.Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWN,itemRect,&m_wndToolBar,IDC_COMBO);

        //콤보박스를 툴바에 붙여준다

        m_combo.AddString("이름"); //내용추가

        m_combo.SetCurSel(0); //셀 선택


35.  Toolbar에 수동으로넣은 ComboBox 사용하기

  afx_msg void [안내]태그제한으로등록되지않습니다-xxOnSelectCombo(); //원형

  ON_CBN_SELCHANGE(IDC_COMBO,[안내]태그제한으로등록되지않습니다-xxOnSelectCombo) //메세지맵에 추가

  CMainFrame *pMain=(CMainFrame *)GetParent(); //메인프레임 주소참조

  CComboBox *pCom=(CComboBox *)(pMain->m_wndToolBar.GetDlgItem(IDC_COMBO));

  //콤보박스의 주소를 가져온다, 접근할 때 메인프레임 -> 툴바 -> 콤보박스 의 순서로 가야한다

  int n=pCom->GetCurSel(); //현재선택된 셀의 인덱스를 가져온다

  if(n==CB_ERR) return; //선택된셀이 없으면 중지한다

  CString str;

  pMain->m_combo.GetLBText(n,str); //선택된셀의 Text를 가져온다


36. UPDATE_COMMAND 사용하기

  pCmdUI->Enable(TRUE); //버튼 활성화

  pCmdUI->SetText((bAdd)?"취소":"신규"); //버튼의 text 설정

  pCmdUI->SetCheck(TRUE);//버튼 체크


37. 프로그램정보저장

  CWinApp::GetProfileString(섹션명,항목명,기본값); // 함수를 사용한다. (문자열)

  CWinApp::GetProfileInt(섹션명,항목명,기본값); //불러올때사용 (숫자) 

  CWinApp::WriteProfileString(섹션명,항목명,값); //저장할때 사용 (문자열)

  CWinApp::WriteProfileInt(섹션명,항목명,값); //저장할때 사용 (숫자)

 //불러올때 사용할함수

  void CMainFrame::ActivateFrame(int nCmdShow) //프로그램 실행후 프레임생성될때 실행

  //저장할 때 WM_DESTROY 메시지 사용


38. 컨트롤바 표시하기

  CMainFrame *pMain=(CMainFrame *)GetParent();//MainFrame 주소가져오기

  //툴바를 bTool2 에따라 보이고 감춘다

  pMain->ShowControlBar(&pMain->m_wndToolBar,bTool1,FALSE);


39. Window 창크기,위치정보 저장하기

  MainFrame 의 WM_DESTROY 에

    WINDOWPLACEMENT w;

    this->GetWindowPlacement(&w); //윈도우의 정보를 저장한다.

    CString strRect;

    strRect.Format("%04d,%04d,%04d,%04d", //04d 는 4자리 확보하고 남은건 0으로 채워라

         w.rcNormalPosition.left,w.rcNormalPosition.top,

         w.rcNormalPosition.right,w.rcNormalPosition.bottom); //윈도우의 위치,크기 확보..

        

        BOOL bMax,bMin; //윈도우의 상태를 저장하기위한 변수

        //w.falg 는 이전상태의 정보를 가지고 잇다!!

        if(w.showCmd==SW_SHOWMINIMIZED)           //최소화 상태

        {

                bMin=TRUE;

                if(w.flags==0) //falg 값이 0 이면 이전 상태가 보통상태이다!!

                        bMax=FALSE;

                else   //이전상태가 최대화 상태

                        bMax=TRUE;

        }

        else                            

        {

                if(w.showCmd==SW_SHOWMAXIMIZED) //최대화상태

                {

                        bMax=TRUE;

                        bMin=FALSE;

                }

                else //보통 상태

                {

                        bMax=FALSE;

                        bMin=FALSE;

                }

        }

        AfxGetApp()->WriteProfileString("WinStatus","Rect",strRect);

        AfxGetApp()->WriteProfileInt("WinStatus","Max",bMax);

        AfxGetApp()->WriteProfileInt("WinStatus","Min",bMin);



//읽어올차례..

ActivateFrame 함수로 가서

        WINDOWPLACEMENT w;  //윈도우의 상태를 저장하는 구조체..

        BOOL bMax,bMin;               //최대,최소상태를 저장할 변수

        CString strRect; //창크기를 받아올 변수

        strRect=AfxGetApp()->GetProfileString("WinStatus","Rect","0000,0000,0500,0700");

        bMin=AfxGetApp()->GetProfileInt("WinStatus","Min",FALSE);

        bMax=AfxGetApp()->GetProfileInt("WinStatus","Max",FALSE);

        int a=atoi(strRect.Left(4)); //문자열을 int 로 바꿔준다.

        int b=atoi(strRect.Mid(5,4));     //atoi 아스키 값을 int형으로 바꿔준다..

        int c=atoi(strRect.Mid(10,4));

        int d=atoi(strRect.Mid(15,4));

        w.rcNormalPosition=CRect(a,b,c,d);

        if(bMin)

        {

                w.showCmd=SW_SHOWMINIMIZED;

                if(bMax)

                {

                        w.flags=WPF_RESTORETOMAXIMIZED  ;

                }

                else

                {

                        w.flags=0;

                }

        }

        else

        {

                if(bMax)

                {

                        w.showCmd=SW_SHOWMAXIMIZED;

                }

                else

                {

                        w.showCmd=SW_SHOWNORMAL;

                }

        }

        this->SetWindowPlacement(&w); //설정된 값으로 윈도우를 그리게 한다..

        

        //CFrameWnd::ActivateFrame(nCmdShow); //이건 반드시 주석처리한다..


40. progress Bar 쓰기

  m_progress.SetRange(m_first,m_last); //Progress 범위설정하기

  m_progress.SetStep(m_step); //Progress Step설정하기

  //m_progress.StepIt(); //스텝만큼 움직이기

  //또는 다음을 사용한다

  for(int a=m_first;a<=m_last;a+=m_step) //a가 처음부터 끝까지

  {

    m_progress.SetPos(a); // 위치를 a에 맞춘다

    Sleep(50); //천천히 움직이게한다

  }


41. 파일대화상자 FileDialog 사용하기

  void CConDlg1::OnFileopen()  //파일열기 버튼

  {

        CFileDialog *fdlg; //파일대화상자 객체 생성 // 포인터로 만든다..

        static char BASED_CODE szFilter[] = "Animate Video Files (*.avi)|*.avi|All Files

                                                                (*.*)|*.*||";

        //필터를 만들어 준다..이건 할줄 모름..

        fdlg =new CFileDialog(TRUE, ".avi", NULL, OFN_HIDEREADONLY |

                                               OFN_OVERWRITEPROMPT,szFilter);

        //대화상자 만들기..이렇게 해야댄다..

        if(fdlg->DoModal()==IDOK) //이제..대화상자를 띠우고..    

        {                               //OK 누르면 실행될 부분..

                m_filename=fdlg->GetPathName();        //대화상자에서 경로를 받아서 저장.

                UpdateData(FALSE);    

        }

  }

  //파일 다이얼로그 만들기

  CFileDialog fdlg(TRUE,"avi",".avi",OFN_OEVRWRITEPROMPT,"Vidoe Files(*.avi)

                                 |*.avi|All Files(*.*)|*.*||");


42. Animate Control 사용하기

  m_animate.Open(m_filename); //파일을 연다

  m_animate.Play(0,-1,1);  //(처음프레임,마지막프레임,반복횟수)

  m_animate.Stop(); //정지시키기

  m_ani.SetAutoStart(TRUE);//자동으로 시작한다

 

43. Control 의 Style 바꿔주기

  Control.ModyfyStyle(제거할스타일,추가할스타일); //스타일은 MSDN내용 참조


44. 시스템 날자바꾸기 버튼

  SetSystemTime(),GetSystemTime() //GMT 표준시를 가져온다.

  GetLocalTime(),SetLocalTime()  //현재 지역시간을 가져온다.


        SYSTEMTIME st;

        GetLocalTime(&st); //현재 시간, 날자를 넣는다.

        st.wYear=m_date2.GetYear();

        st.wMonth=m_date2.GetMonth();

        st.wDay=m_date2.GetDay();

        SetSystemTime(&st);


45. 시스템 시간 바꾸기 버튼

        UpdateData(TRUE);

        SYSTEMTIME st;

        GetLocalTime(&st);

        st.wHour=m_time.GetHour();

        st.wMinute=m_time.GetMinute();

        st.wSecond=m_time.GetSecond();

        SetLocalTime(&st);


46.시스템의 드라이브 문자 얻기

        char temp[50];

        GetLogicalDriveStrings(sizeof(temp),temp);

        CString str,str1;

        int n=0;

        while(*(temp+n)!=NULL)

        {

                str=temp+n;

                str1+= " "+str.Left(2);

                n+=4;

        }


47. 현재 작업경로 얻기

  char temp[MAX_PATH]; //MAX_PATH 는 경로길이의 최대를 define 해놓은것.

  GetCurrentDirectory(sizeof(temp),temp);  // 현작업하는 경로(경로 길이,문자형);


48. Tree Control 사용하기

  HTREEITEM hmov,hmus; //핸들을받을 변수 이게 잇어야 하위 디렉토리 생성가능

  hmov=m_tree.InsertItem("영화",TVI_ROOT,TVI_LAST); //,TVI_ROOT,TVI_LAST는 default

  hm1=m_tree.InsertItem("외화",hmov);  //hmov 아래 “외화”트리 생성

  CImageList m_image; //그림을 사용하기 위한 클래스다!! 알아두자..

  m_tree.SetImageList(&m_image,TVSIL_NORMAL); //Tree View Style Image List => TVSIL

  hmov=m_tree.InsertItem("영화",0,1,TVI_ROOT,TVI_LAST);//TVI_ROOT,TVI_LAST는 default

  hmus=m_tree.InsertItem("가요",1,2);//("문자열",처음그림번호,선택시그림)

  hm1=m_tree.InsertItem("외화",2,3,hmov); //그림 번호는 default 로 0이 들어간다..


49. List Control 사용하기

  m_list.ModifyStyle(LVS_TYPEMASK, LVS_ICON); //리스트를 큰아이콘형태로 보인다

  m_list.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON);//리스트를 작은아이콘형태

  m_list.ModifyStyle(LVS_TYPEMASK, LVS_LIST); //리스트를 리스트형태로 보인다

  m_list.ModifyStyle(LVS_TYPEMASK, LVS_REPORT); //리스트를 자세히형태로 보인다


  CImageList m_treeimage; //이미지리스트

  CImageList m_small, m_large;

  m_large.Create(IDB_LARGE,32,0,RGB(255,255,255)); //이거는 클래스에서 추가해준거다

  m_small.Create(IDB_SMALL,16,0,RGB(255,255,255));// (bmp ID값,

  m_list.SetImageList(&m_large,LVSIL_NORMAL);

  m_list.SetImageList(&m_small,LVSIL_SMALL);

  CString name[]={"홍길동","진달래","한국남","개나리"};

  CString tel[]={"400-3759","304-7714","505-9058","700-9898"};

  CString born[]={"1980-1-1","1981-12-20","1980-05-15","1981-08-31"};

  CString sex[]={"남자","여자","남자","여자"};

       

  m_list.InsertColumn(0,"이름",LVCFMT_LEFT,70);

  m_list.InsertColumn(1,"전화번호",LVCFMT_LEFT,80);

  m_list.InsertColumn(2,"생일",LVCFMT_LEFT,90);

  m_list.InsertColumn(3,"성별",LVCFMT_LEFT,50);

        LVITEM it; //리스트 구조체

        char temp[100];

        for(int a=0;a<4;a++)

        {       

                int n=(sex[a]=="남자")?0:1;

                m_list.InsertItem(a,name[a],n); //insert item 은 행을 만들고..

                it.mask=LVIF_TEXT|LVIF_IMAGE; //마스크 설정

                it.iItem=a;

                it.iSubItem=1;//열 설정

                strcpy(temp,tel[a]); //이거 모하는거냐..

                it.pszText=temp;

                m_list.SetItem(&it);                     // setitem 열에 정보를 넣는다.


                it.iSubItem=2; //열 설정

                strcpy(temp,born[a]); //이거 모하는거냐..

                it.pszText=temp;

                m_list.SetItem(&it);                      // setitem 열에 정보를 넣는다.


                it.iSubItem=3; //열 설정

                strcpy(temp,sex[a]); //이거 모하는거냐..

                it.pszText=temp;

                m_list.SetItem(&it);                      // setitem 열에 정보를 넣는다.


50. Bitmap Button 사용하기

  CBitmapButton 을 사용한다! CButton 에서 상속 받는클래스임..

  m_button1.Create(NULL, WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,

                                 CRect(310,20,370,50), this,IDC_MYBUTTON); //버튼만들기

  m_button1.LoadBitmapsIDB_UP,IDB_DOWN,IDB_FOCUS,IDB_DISABLE);//버튼의 그림설정

  m_button1.SizeToContent(); //버튼을 그림 크기로 맞춰 준다!!


 //그냥 버튼을 비트맵버튼으로 바꾸기 -> 버튼을 만든다 속성에서 OWNERDRA 속성에 체크!!

  m_button2.LoadBitmaps(IDB_UP,IDB_DOWN,IDB_FOCUS,IDB_DISABLE); //버튼 그림설정

  m_button2.SizeToContent(); //버튼을 그림 크기로 맞춰 준다!!


51. 중복없는 난수발생하기

        int su; //발생된 난수저장

        int a,b;

        BOOL bDasi; //숫자가중복될경우 다시하기위한 변수

        for(a=0;a<9;a++)  //난수 9개 발생

        {

                bDasi=TRUE;

                while(bDasi)

                {

                        bDasi=FALSE;

                        su=rand()%10; //난수발생

                        for(b=0;b

                        {

                                if(temp[b]==su)  //중복이면

                                {

                                        bDasi=TRUE; //중복이 잇으면 다시while 문을 실행한다

                                        break;

                                }//if

                        }//for

                }//while

                temp[a]=su; //중복이 아니면 대입한다


52. 메뉴 범위로 사용하기

  ON_COMMAND_RANGE(ID_LEVEL3,ID_LEVEL9,OnLevel); //범위메세지 발생

  //메뉴 ID의 값이 연속된 숫자일 경우 범위로 지정해서 사용할수잇다


53. 한,영 전환함수

  void CCustView::SetHangul(BOOL bCheck) //T:한글 F:영문 이건 외우자..

  {

      //뷰클래스의 윈도우 핸들포인터를 얻는다.

      HIMC hm=ImmGetContext(this->GetSafeHwnd());

      if(bCheck)

      {

          ::ImmSetConversionStatus(hm,1,0);//1은 한글 0은 영문

      }

      else

      {

          ::ImmSetConversionStatus(hm,0,0); //영문으로 바꿔준다

      }

      ::ImmReleaseContext(this->GetSafeHwnd(),hm); //장치를 풀어준다

  }

  #include "imm.h" //헤더 반드시 추가하고

  imm32.lib (라이브러리 파일)를 반드시 링크해주어야 한다!

  **** 라이브러리 추가하기

  프로젝트메뉴 -> 셋팅 -> 링크탭


54. DLL함수정의하기

  임포트함수 :  extern "C"  __declspec(dllimport)   리터형  함수명(매개변수,...) ;

  - 메인프로그램에서 DLL에 있는 함수를 호출할때 사용한다.


  엑스포트함수 :  extern "C"  __declspec(dllexport)   리터형  함수명(매개변수,...)

                      {

                             내용;

                      }



[VC++] GetLastError 이용한 에러 메시출력 - Win32 API
{
  DWORD eErrorCode  = GetLastError(); // thread 당 1개씩 존재하는 에러코드를 얻는다.
  printf("FAIL : %d ",e);  // 에러번호를 출력

  //에러번호 -> 문자열 변환
  char *szErrorMessage = NULL;

  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER,
      0, //문자열을 가진 DLL핸들(0: 시스템으로 부터 얻는다)
      eErrorCode, //에러 번호
      0, //언어
      (char*)&szErrorMessage,0, // 버퍼, 버퍼크기
      0); // va_list형 변수로 얻을때 사용

  printf( "%s ",szErrorMessage );
 
  // FormatMessage() is use the  LocalAlloc() in FormatMessag,
  // you can free buffer for LocalFree....
  LocalFree( szErrorMessage );
 }


[string 변환] wchar -> char char -> wchar
//  char -> wchar

wchar_t* CharToWChar(const char* pstrSrc)
{
    ASSERT(pstrSrc);
    int nLen = strlen(pstrSrc)+1;

    wchar_t* pwstr      = (LPWSTR) malloc ( sizeof( wchar_t )* nLen);
    mbstowcs(pwstr, pstrSrc, nLen);

    return pwstr;
}



 

// wchar -> char
char* WCharToChar(const wchar_t* pwstrSrc)
{
    ASSERT(pwstrSrc);

#if !defined _DEBUG
    int len = 0;
    len = (wcslen(pwstrSrc) + 1)*2;
    char* pstr      = (char*) malloc ( sizeof( char) * len);

    WideCharToMultiByte( 949, 0, pwstrSrc, -1, pstr, len, NULL, NULL);
#else

    int nLen = wcslen(pwstrSrc);

    char* pstr      = (char*) malloc ( sizeof( char) * nLen + 1);
    wcstombs(pstr, pwstrSrc, nLen+1);
#endif

    return pstr;
}


찾으려고 보면 없죠......

그럼 고운하루 되세요~!!
 



"msvcrtd.lib" 링크시 문제
LNK4098: defaultlib "msvcrtd.lib" conflicts ... 학습중(Windows)

C Run-Time Library는 standard library를 말합니다.

printf, strcpy, malloc, new, cin, cout 등등이  이 라이브러리에 포함됩니다.


종류는 꽤 많은데, 별로 복잡하지는 않습니다.

libc.lib : c언어에 해당하는 라이브러리 입니다. printf, strcpy, malloc 등이 구현되어 있습니다.

libcmt.lib : libc 와 동일합니다만, 이것은 멀티쓰레드 용입니다.

msvcrt.lib : libc 와 동일합니다만, 이것은 dll 용입니다.

               ( 위의 두가지는 static link 로 사용되고, 이것은 dynamic link 로 사용됩니다.)



libcp.lib : c++언어에 해당하는 라이브러리 입니다. cin,  cout, new  등이 구현되어 있습니다.

libcpmt.lib : libcp 와 동일합니다만, 이것은 멀티쓰레드 용입니다.

msvcprt.lib : libcp 와 동일합니다만, 이것은 dll 용입니다.

               ( 위의 두가지는 static link 로 사용되고, 이것은 dynamic link 로 사용됩니다.)



그러므로, 위의 라이브러리는 두개의 그룹중에 하나씩만 포함이 되어야 합니다.

만약, libc 와 msvcrt 가 둘다 링크되면 중복선언 되었다는 에러가 납니다.


하지만, 다른 프로젝트에서 가지고 왔다면, 이러한 링크옵션 수정하는 것이 쉽지 않을 수 있습니다.

프로젝트 구조를 보아야 알 수 있으나, 한가지 해결방법은....


링크에서 메세지에도 나와 있듯이, 링크 옵션에 다음을 추가 하십시오.

/NODEFAULTLIB:library

 

library 에 포함시키지 말아야 할 라이브러리를 추가하시면, 이 라이브러리는 링크에 포함되지 않습니다.

 

그러면, 중복 선언 에러는 해결 할 수 있습니다.



 출처 : Devpia / VC++ / 질문답변 / 572567

작성자 : 김무석(kim790815) 님



BLOG main image
취미생활
 Notice
 Category
분류 전체보기 (191)
매일매일갱생 (83)
서버개발 (1)
임베디드개발 (12)
Programming (80)
Personal Projects (6)
유용한 프로그램 (0)
 TAGS
Brazil 미라지폰 벨소리 변경 Linux Debug english email Algorithm 출장 C Java MP3 DirectShow M480 영어 이메일 It 서태지 군대 VC++ Error Case 개발자 project ISDB-T English DVB 음식 Windows Mobile6.0 DVB-T Wince5.0 spam mail 1seg 알고리즘 warning C++ isdbt 퇴사 debugging Dshow 티스토리초대 티스토리 초대장
 Calendar
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
 Recent Entries
 Recent Comments
 Recent Trackbacks
 Archive
 Link Site
zextor
괴짜 프로그래머의 일상사~@@
Gag & Peace, and more..
Kazakhstan Almaty.......
Min-A
Sadgarret
Steve Yoon's log
가슴 뛰는 삶을 살아라
오스틴 파워
GUI sin
melanie parker_Lady
제레미의 TV 2.0 이야기..
 Visitor Statistics
Total :
Today :
Yesterday :
rss