블로그 이미지
fiadot_old

칼퇴근을 위한 게임 서버 개발 방법론에 대한 심도있는 고찰 및 성찰을 위한 블로그!

Rss feed Tistory
Technical Article/펌 2004. 5. 6. 13:57

Macro to Add New Classes to Visual C++ Projects

'------------------------------------------------------------------------------
'FILE DESCRIPTION: A description was not provided.
'------------------------------------------------------------------------------






Function GetProjectPath(ByVal proj)
dim szProjectPath
dim nIndex
dim szReturn

szProjectPath = proj.FullName
nIndex = InStrRev(szProjectPath, "\")

if (nIndex <> 0) then
  szReturn = Left(szProjectPath, nIndex)
end if

GetProjectPath = szReturn
End Function

Sub ClassGenerator
'DESCRIPTION: Creates minimal source/header files for a
' class, given its input name.
On Error Resume Next

dim szClassName
dim szClassRoot ' classname minus any MFC-style prefix
dim szSourceFile
dim szHeaderFile

' used to determine full paths for the added
' source/header file
dim szProjectPath

dim szTempPath
dim szHeaderPreprocessor, szHeaderClassBegin
dim szFirstChar, szSecondChar

' make sure the project is valid
if ActiveProject.Type <> "Build" then
  MsgBox "This project is not valid. Ending macro."
  Exit Sub
end if

' enter the class name
szClassName = InputBox("Enter the class name:", "Class Name")
if (len(szClassName) <= 0) then
  MsgBox "Invalid class name. Ending macro."
  Exit Sub
end if

' generate file names based on the input
' class name
szSourceFile = szClassName + ".cpp"
szHeaderFile = szClassName + ".h"

' test for MFC style class names [ie: CClassName's
' file should be ClassName.h"] all we do is check the
' first to characters; if they're both capitals, we
' don't use the first one
szFirstChar = Left(szClassName, 1)
szSecondChar = Mid(szClassName, 2, 1)

if ( ((Asc(szFirstChar) >= 65) and (Asc(szFirstChar) <= 90)) _
and ((Asc(szSecondChar) >= 65) and (Asc(szSecondChar) <= 90)) ) _
then
  szSourceFile = Mid(szSourceFile, 2)
  szHeaderFile = Mid(szHeaderFile, 2)
  szClassRoot = Mid(szClassName, 2)
else
  szClassRoot = szClassName  
end if

' add the files to the project -- if they can't be added,
' Resume Next will see to it that we skip past this
ActiveProject.AddFile szSourceFile
ActiveProject.AddFile szHeaderFile

' get the project path
szProjectPath = GetProjectPath(ActiveProject)

' now add the header file to the hard drive
Documents.Add "Text"

ActiveDocument.Selection.StartOfDocument

ActiveDocument.Selection = "#ifndef " & UCase(szClassRoot) _
  & "_H_" & vbCrLf & _
  "#define " & UCase(szClassRoot) & "_H_" & vbCrLf & _
  vbCrLf & _
  "class " & szClassName & vbCrLf & _
  "{" & vbCrLf & _
  "public:        // object creation/destruction" & vbCrLf & _
  "   " & szClassName &  "();" & vbCrLf & _
  "   " & szClassName & "(const " & szClassName & "& source);" _
  & vbCrLf & _
  "   " & szClassName & "& " & "operator=(const " & szClassName _
  & "& right);" & vbCrLf & _
  "   virtual " & "~" & szClassName & "();" & vbCrLf &_
  vbCrLf &_
  "public:        // attribute modification" & vbCrLf & _
  vbCrLf & _
  "protected:     // protected members" & vbCrLf & _
  "   void assign(const " & szClassName & "& source);" _
  & vbCrLf & vbCrLf & _
  "private:       // attributes" & vbCrLf & _
  "};" & vbCrLf & _
  vbCrLf & _
  "#endif"

ActiveDocument.Save szProjectPath & szHeaderFile


' now add the source file to the hard drive
Documents.Add "Text"

ActiveDocument.Selection.StartOfDocument

ActiveDocument.Selection = "#include " & Chr(34) & szHeaderFile _
  & Chr(34) & vbCrLf & vbCrLf & _
  szClassName & "::" & szClassName & "()" & vbCrLf & _
  "{" & vbCrLf & _
  "   // nothing to do yet" & vbCrLf & _
  "}" & vbCrLf & _
  vbCrLf & _
  szClassName & "::" & szClassName & "(const " & szClassName _
  & "& source)" & vbCrLf & _
  "{" & vbCrLf & _
  "   assign(source);" & vbCrLf & _
  "}" & vbCrLf & _
  vbCrLf & _
  szClassName & "& " & szClassName & "::" & "operator=(const " _
  & szClassName & "& right)" & vbCrLf & _
  "{" & vbCrLf & _
  "   if (this != &right)" & vbCrLf & _
  "   {" & vbCrLf & _
  "      assign(right);" & vbCrLf & _
  "   }" & vbCrLf & _
  vbCrLf & _
  "   return (*this);" & vbCrLf & _
  "}" & vbCrLf & _
  vbCrLf & _
  szClassName & "::~" & szClassName & "()" & vbCrLf & _
  "{" & vbCrLf & _
  "   // nothing to do yet" & vbCrLf & _
  "}" & vbCrLf & _
  vbCrLf & _
  "void " & szClassName & "::assign(const " & szClassName _
  & "& source)" & vbCrLf & _
  "{" & vbCrLf & _
  "   // assign all of source's members to this*" & vbCrLf & _
  "}" & vbCrLf

ActiveDocument.Save szProjectPath & szSourceFile

End Sub
,
Technical Article/펌 2004. 4. 27. 21:04

ViewFrame이상함~

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력해주세요.

Technical Article/펌 2004. 4. 19. 03:55

릴 만든 사람이 할줄아는거

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력해주세요.

Technical Article/펌 2004. 4. 19. 03:54

PS (Process Status) for Windows 95 and Windows NT

PS (Process Status) for Windows 95 and Windows NT

http://codeguru.earthweb.com/win32/ps.shtml
,
Technical Article/펌 2004. 4. 19. 03:54

프로세스별 CPU사용율 알아내기

제 목 프로세스별 CPU사용율 아라내기
작 성 자 김한석(khs09188)    첨 부
파 일  
작성시각 2002-02-05 오후 11:53:49
조 회 수 1933

쩝 이거 알아내는라고 좀 뭐좀 빠졌습니다.

소스는 기본적으로 두부분으로 나뉘어져 있습니다.
첫부분은 현메모리에 떠 있는 프로세스의 정보를 취득
해오는 부분인데, 타스크메니저의 프로세스가 사용하는
것과 동일한 프로세스만 취득해옵니다. 왜냐면 phd함수를
사용해서 Enumerate하기 때문이죠. 그래서 두가지 프로세스
는 제외시켰습니다.(Idle, _Total).클클

그 다음은 pdh함수를 사용하여 위에서 취득한 프로세스별로
카운터를 설정하고 측정한후 그 결과값을얻을 수 있습니다.
이 소스를 가지고 많은 활용 할수 있으리라 믿습니다.

이 프로그램은 지정된 퍼센트이상인 프로세스만 추려내는
함수입니다.

좀더 나은 방법을 알고 계시다면 저에게도 좀 알려주시고요.
그럼 즐프하세요.


/*< Usage >*********************************************************************
*
* int GetProcessCpuUsage (
*   inLimitPercent  : Percent of CPU Usage Alarm Level ( 0~100 )
* )
* return value :  0 : Normal Ended
*                -1 : Abnormally Ended
*
* Result Value :
*        int    ginRetProcessCount : Count of Result Process
*        char   gchRetProcess[MAX_PROCESS_COUNT][MAX_PROCESSNAME_LENGTH]
*               : String Array of Result Process
*
* ##Caution : It must be included "pdh.lib"
*
********************************************************************************
*/
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <pdh.h>
#include <malloc.h>

/*******************************************************************
*                                                                  *
*                        PreDefine Value                           *
*                                                                  *
*******************************************************************/

#define CPU_WARN_LIMIT           90 /* Percent of CPU alarm limit     */
#define MAX_PROCESS_COUNT       128 /* Count of Max Process on Memory */
#define MAX_PROCESSNAME_LENGTH   64 /* Length of Process Name         */
#define MAX_EXCEPT_COUNT          2 /* Count of Except Process Name   */

/*******************************************************************
*                                                                  *
*                Global Area for the Result Value                  *
*                                                                  *
*******************************************************************/

int     ginRetProcessCount;     /* Count of Result                */

char    gchRetProcess[MAX_PROCESS_COUNT][MAX_PROCESSNAME_LENGTH];
                                /* Result of Process Name         */

/*******************************************************************
*                                                                  *
*                         Subroutine Start                         *
*                                                                  *
*******************************************************************/

int GetProcessCpuUsage(int inLimitPercent)
{
    /***************************************************************
    *                                                              *
    *               Define Variables and Initialize                *
    *                                                              *
    ***************************************************************/

    HQUERY      hQuery;
    HCOUNTER    hCounter[MAX_PROCESS_COUNT];
    char        chCounterName[256];
    PDH_FMT_COUNTERVALUE    FmtValue;

    int     inRet = 0, i = 0;
    int     inExceptFoundFlg;  /* Flag of Except Process Name exist  */
    int     inProcessCount;    /* Count of Process Name after fetch  */
                               /* Result of Enumerate Process Name   */
    char    chProcess  [MAX_PROCESS_COUNT][MAX_PROCESSNAME_LENGTH];
                               /* Except Process Define Array        */
    char    chExcepName[MAX_EXCEPT_COUNT][MAX_PROCESSNAME_LENGTH]
            = {"Idle","_Total",};

    PDH_STATUS  pdhStatus               = ERROR_SUCCESS;
    LPTSTR      szCounterListBuffer     = NULL;
    DWORD       dwCounterListSize       = 0;
    LPTSTR      szInstanceListBuffer    = NULL;
    DWORD       dwInstanceListSize      = 0;
    LPTSTR      szThisInstance          = NULL;

    inProcessCount     = 0;
    ginRetProcessCount = 0;
    memset(chProcess,     (char)NULL, sizeof(chProcess)    );
    memset(gchRetProcess, (char)NULL, sizeof(gchRetProcess));

    /***************************************************************
    *                                                              *
    *        Get the list of working processes on memory           *
    *                                                              *
    ***************************************************************/

    // Determine the required buffer size for the data.
    pdhStatus = PdhEnumObjectItems (
        NULL,                   // reserved
        NULL,                   // local machine
        TEXT("Process"),        // object to enumerate
        szCounterListBuffer,    // pass in NULL buffers
        &dwCounterListSize,     // an 0 length to get
        szInstanceListBuffer,   // required size
        &dwInstanceListSize,    // of the buffers in chars
        PERF_DETAIL_WIZARD,     // counter detail level
        0);

    if (pdhStatus == ERROR_SUCCESS)
    {
        // Allocate the buffers and try the call again.
        szCounterListBuffer  = (LPTSTR)malloc ((dwCounterListSize  * sizeof
(TCHAR)));
        szInstanceListBuffer = (LPTSTR)malloc ((dwInstanceListSize * sizeof
(TCHAR)));

        if ((szCounterListBuffer != NULL) && (szInstanceListBuffer != NULL))
        {
            pdhStatus = PdhEnumObjectItems (
                NULL,                    // reserved
                NULL,                    // local machine
                TEXT("Process"),        // object to enumerate
                szCounterListBuffer,    // pass in NULL buffers
                &dwCounterListSize,     // an 0 length to get
                szInstanceListBuffer,   // required size
                &dwInstanceListSize,    // of the buffers in chars
                PERF_DETAIL_WIZARD,     // counter detail level
                0);
            if (pdhStatus == ERROR_SUCCESS)
            {
                // Walk the return instance list.
                for (szThisInstance = szInstanceListBuffer;
                     *szThisInstance != 0;
                     szThisInstance += lstrlen(szThisInstance) + 1)
                {
                    /* Check Except Process Name */
                    inExceptFoundFlg = 0;
                    for ( i = 0 ; i < MAX_EXCEPT_COUNT ; i++ )
                    {
                        if ( memcmp(szThisInstance, chExcepName[i], strlen
(chExcepName[i])) != 0 )
                            continue;
                        else
                        {
                            inExceptFoundFlg = 1;
                            break;
                        }
                    }
                    if ( !inExceptFoundFlg )
                        /* Set the process */
                        sprintf(chProcess[inProcessCount++], "%s",
szThisInstance);

                }
            }
        }
        else inRet = -1;

        if (szCounterListBuffer != NULL) free (szCounterListBuffer);

        if (szInstanceListBuffer != NULL) free (szInstanceListBuffer);
    }
    else inRet = -1;

    /***************************************************************
    *                                                              *
    *              Find the process over the limit                 *
    *                                                              *
    ***************************************************************/

    /* Open a query */
    PdhOpenQuery(NULL, 0, &hQuery);

    /* Add counter name */
    for( i = 0 ; i < inProcessCount ; i++ )
    {
        memset( chCounterName, (char)NULL, sizeof(chCounterName) );
        sprintf(chCounterName, "\\Process(%s#0)\\%% Processor Time", &chProcess
[i]);
        PdhAddCounter(hQuery, chCounterName, 0, &hCounter[i]);
    }

    /* Get the data */
    PdhCollectQueryData(hQuery);
    Sleep(100);
    PdhCollectQueryData(hQuery);

    /* Find a result */
    for( i = 0 ; i < inProcessCount ; i++ )
    {
        PdhGetFormattedCounterValue(hCounter[i], PDH_FMT_DOUBLE, NULL, &FmtValue);
        if( (int)FmtValue.doubleValue >= inLimitPercent )
        {
            /* Found the process over the limit */
            sprintf(gchRetProcess[ginRetProcessCount++], "%s", &chProcess[i]);
        }
    }

    /* Close a query */
    PdhCloseQuery(hQuery);

    /* Normally Ended */
    return 0;
}
/*******************************************************************
*                                                                  *
*                         Subroutine End                           *
*                                                                  *
*******************************************************************/


int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    int inRet = 0;

    /* Get the process over the limit */
    inRet = GetProcessCpuUsage( CPU_WARN_LIMIT );
    if( inRet )
    {
        /* Error */
        return -1;
    }

    /* Normally Ended */
    return 0;
}
,
Technical Article/펌 2004. 4. 19. 03:54

프로세스실행시키고 종료되기까지 기다리기..

Visual C++ (VC++ 일반)      데브피아 시삽 발표          

제     목 프로세스실행시키고 종료되기까지 기다리기..
작 성 자 한상철(bluehous)   첨 부
파 일  
작성시각 2002-07-22 오전 12:13:08
조 회 수 663

프로세스를 실행시키고.. 해당프로세스의 작업이 완료되었는지 기다린뒤  다음 코드를 수행하는 루틴입니다..



SHELLEXECUTEINFO sei = {0};

sei.cbSize = sizeof (SHELLEXECUTEINFO);
sei.fMask  = SEE_MASK_NOCLOSEPROCESS;
sei.lpVerb = "open";
sei.lpFile = "notepad.exe";
sei.nShow  = SW_SHOWNORMAL;

if (ShellExecuteEx (&sei))
{
   WaitForSingleObject (sei.hProcess, INFINITE);
}
,
Technical Article/펌 2004. 4. 5. 20:36

SP(Stored Procedure)를 사용해보자!

USE pubs
GO

--프로시져 생성구문
CREATE PROC up_konan1
AS
SELECT * FROM titles
GO

--프로시져 수행 구문
EXEC up_konan1



[일반 쿼리와 장단점 비교]
일반 SQL구문을 수행할 경우

- 처음 수행시

1. 구문 분석단계 - SQL구문의 문법을 검사합니다.

2. 표준화 - DB의 개체들(테이블 등)에 대해서 검사합니다.

3. 보안 점검 - 해당하는 DB개체들에 대한 사용자의 사용 권한을 검사합니다.

4. 최적화 - 최적의 성능을 내기위한 사항을 적용합니다.

5. 컴파일

 

- 반복 수행시

1. 처음 수행한 일반 SQL구문의 실행 계획이 캐싱되어 있는지 확인후 이를 수행합니다

2. 캐싱되어 있지 않을 경우 처음수행시의 5단계를 다시 수행함.


저장 프로시져를 수행할 경우

- 생성시

1. 구문 분석 단계 - 프로시져 생성 구문의 SQL구문들을 검사합니다.

2. 표준화 - DB의 개체들(테이블 등)에 대해서 검사합니다.

3. 보안 점검 - 프로시져에 대해서 생성이 가능한지 검사합니다.

4. 해당 프로시져의 구문과 생성 정보를 저장합니다.

 

- 첫 실행시

1. 보안 점검 - 해당하는 DB개체들에 대한 사용자의 사용 권한을 검사합니다.

2. 최적화 - 최적의 성능을 내기위한 사항을 적용합니다.

3. 컴파일후 수행 계획을 생성후 캐시에 저장후 실행합니다.

 

- 반복 수행시

1. 실행 계획이 캐싱이 된지 확인후 실행 합니다.

2. 캐시에 실행 계획이 없을 경우 - 처음 실행 과정을 반복 합니다.






저장 프로시져 생성 문법

  
CREATE PROC [ EDURE ] procedure_name [ ; number ]
     [ { @parameter data_type }
         [ VARYING ] [ = default ] [ OUTPUT ]
     ] [ ,...n ]

[ WITH
     { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]

[ FOR REPLICATION ]

AS sql_statement [ ...n ]




일반적인 프로시져의 생성

  
USE pubs
GO

--프로시져 생성구문
CREATE PROC up_konan2
AS
SELECT pub_id 저자, type 책종류, royalty 로열티, ytd_sales 팔린수, AVG(price) 평균값
FROM titles
GROUP BY pub_id, type, royalty, ytd_sales
WITH CUBE
GO

--프로시져 수행 구문
EXEC up_konan2

 




[매개변수를 사용한 저장 프로시져]

--프로시져 생성
CREATE PROC up_konan_test7
@v_price int
AS
SELECT * FROM titles WHERE price > @v_price

--프로시져 수행
EXEC up_konan_test7 30

EXEC up_konan_test7 50




--테스트 테이블 생성
CREATE TABLE konan_test9(
c1 int
, c2 varchar(10)
)

--프로시져 생성
CREATE PROC up_konan_test9
@v_c1 int
, @v_c2 varchar(10)
AS
INSERT INTO konan_test9(c1, c2) VALUES(@v_c1, @v_c2)

--프로시져 수행
EXEC up_konan_test9 1, 'Hi~'

EXEC up_konan_test9 2, '테스트'

--데이터 조회
SELECT * FROM konan_test9




--프로시져 생성
CREATE PROC up_konan_test10
@v_tblname varchar(20)
, @v_title_id varchar(20)
AS
--저장할 변수 선언
DECLARE @v_strSQL VARCHAR(200)
--변수 @v_strSQL에 생성된 문자열 저장
SET @v_strSQL = 'SELECT * FROM ' + @v_tblname +
' WHERE title_id = ''' + @v_title_id + ''''
EXEC(@v_strSQL)
--SELECT @v_strSQL

--프로시져 수행
EXEC up_konan_test10 'titles', 'BU1032'

EXEC up_konan_test10 'titles', 'BU1111'

EXEC up_konan_test10 'titleauthor', 'BU1111'

EXEC up_konan_test10 'titleauthor', 'BU1032'




자 뭔가 갑자기 어려워 진듯 하시지용? ^_^

자 제가 이번에 보여드린 프로시져만 이해 하시면 프로시져의 80%는 이해 하신 겁니다.

천천히 설명을 드리지요.

CREATE PROC up_konan_test10
@v_tblname varchar(20)
, @v_title_id varchar(20)

자 저는 매개변수를 두개 받았습니다.

이름에서 대강 느끼시겠지만.. 테이블을 받을 변수 @v_tblname,

title_id를 받을 변수 @v_title_id 를 두었습니다. ^_^

--저장할 변수 선언
DECLARE @v_strSQL VARCHAR(200)
--변수 @v_strSQL에 생성된 문자열 저장
SET @v_strSQL = 'SELECT * FROM ' + @v_tblname +
' WHERE title_id = ''' + @v_title_id + ''''


프로시져 내부에서 사용할..  문자열 연결로 SQL구문을 생성할 변수인

@v_strSQL 변수를 생성 했습니다. 아울러 VARCHAR(200) 이라는 조금 긴 문자열도

저장이 가능하게 생성 했습니다.

이어서 SET 구문을 이용해 @v_strSQL 변수에 문자열을 구성합니다.

작은따옴표 의 갯수가 상당히 중요 합니다.

작은 따옴표 하나를 문자열 내에서(문자열은 작은 따옴표로 묶이지요) 표현 하려면?

작은 따옴표 두개를 사용해야 합니다.

아울러 쿼리의 띄어쓰기도 주의 하셔야 합니다. FROM 절의 앞과 뒤에서 공백을 하나씩

주어서 문제없이 SQL구문이 생성되도록 주의해 주셔야 합니다.

끝으로...

EXEC(@v_strSQL)
--SELECT @v_strSQL

두줄 입니다.

해당하는 쿼리를 디버깅 하는 것은 상당히 귀찮은 작업 입니다.

--EXEC(@v_strSQL)
SELECT @v_strSQL  처음 수행시는 이처럼..

수행을 하는 구문인 EXEC 구문대신에.. 아래처럼 SQL구문이 SELECT되게 하는

프로시져를 생성 합니다.

그러면 위에서 약간 복잡한 해당하는 SQL구문이 구성된 녀석이 프로시져 수행시

리턴 될겁니다. 그런후 결과창의 구성된 SQL구문을 질의 분석기(쿼리 어낼라이져)로

옮기신후 여기서 수행해 보신후 잘 생성이 되었나 안되었나를 알아 보신후

테스트 해 보시면 되겠지요.  그런후 ALTER PROCEDURE 구문으로

해당 프로시져를

EXEC(@v_strSQL)
--SELECT @v_strSQL

이러한 식으로 EXEC - 수행되게 변경을 하신후.. 프로시져를 수행 하시면?

결과가 잘 나오는 것을 보실 겁니다. ^_^

 

그렇다면!!!  왜 저런 복잡한듯한... 문자열 생성 방식을 사용해야 하는 것인가!!!

간단합니다. 테이블명과 같은 객체형 값(Object Value)는 프로시져의 매개변수로

사용이 불가 합니다.




--프로시져 생성 - 수행 안됨
CREATE PROC up_konan_test11
@v_tblname varchar(20)
AS
SELECT * FROM @v_tblname

--일반 비교값으로 생성하는 프로시져
CREATE PROC up_konan_test11
@v_title_id varchar(20)
AS
SELECT * FROM titles WHERE title_id = @v_title_id

--프로시져 수행
EXEC up_konan_test11 'BU1032'








다음으로 TOP 구문을 이용할 경우 입니다.

SELECT TOP 10 * FROM titles 이런 식으로 사용을 하시지요?

이때 10 과 같은 TOP의 값을 수행하고 싶을 경우 입니다.

  

--프로시져 생성 - 수행 안됨
CREATE PROC up_konan_test12
@v_topN int
AS
SELECT top @v_topN * FROM titles

--프로시져 생성 - 프로시져 생성은 가능. 수행은 불가
CREATE PROC up_konan_test12
@v_topN int
AS
DECLARE @v_strSQL VARCHAR(200)
SET @v_strSQL = 'SELECT top ' + @v_topN + ' * FROM titles'
EXEC(@v_strSQL)

--프로시져 수행. 수행 불가
EXEC up_konan_test12 '10'


--프로시져 생성
CREATE PROC up_konan_test13
@v_topN varchar(5) --여기가 틀림
AS
DECLARE @v_strSQL VARCHAR(200)
SET @v_strSQL = 'SELECT top ' + @v_topN + ' * FROM titles'
EXEC(@v_strSQL)

--프로시져 수행
EXEC up_konan_test13 '10'

,
Technical Article 2004. 4. 2. 13:32

다이얼로그(dialog) 관련 옵션

App 타이틀 설정
BOOL OnInitDialog()

SetWindowText(_T("Note MP3 Manager For Winamp"));

최상위 옵션
SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); // Top most 옵션 enable!

창 최대화
PostMessage(WM_SYSCOMMAND,SC_MAXIMIZE,0); // 최대화~


엔터키 막기 & 키처리
BOOL CNoteAmpDlg::PreTranslateMessage(MSG* pMsg)
{
// 추가해야 할부분 [!!!]

if ( pMsg->message == WM_KEYDOWN )
{
if( pMsg->wParam == VK_RETURN || pMsg->wParam==VK_ESCAPE )
{


}
else if ( pMsg->wParam == VK_F1 )
{

}
else if ( pMsg->wParam == VK_SPACE )
{
return TRUE;
}
}

return CDialog::PreTranslateMessage(pMsg);
}

윈도우 핸들 얻기
GetSafeHwnd();

CWinApp 얻기
AfxGetApp()->

edit나 static 글자 바꾸기
GetDlgItem(IDC_EDIT_FILENAME)->SetWindowText("으하하");
,
Technical Article/펌 2004. 4. 1. 11:38

[GPG] DB 쿼리 서버 관련 의견모음

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력해주세요.

Technical Article/펌 2004. 3. 2. 15:43

Naming방법

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력해주세요.

TOTAL TODAY