728x90
반응형

전체 글 326

[MFC] MDI에서 시작 시 새 창 방지 코드

MFC에서 MDI로 프로젝트를 만들면, 실행 후 항상 새 창 하나가 나타난다. 이것을 방지하기 위해서는 App 파일의 InitInstance() 함수에 아래와 같은 코드를 집어넣어주면 된다. // Parse command line for standard shell commands, DDE, file open CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // 새창 열기 금지 if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew) cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing; 함수가 끝나가기 직전에 위치하고 있다.

[MFC] MDI에서 새창 열기

CDocTemplate* pTemplateDoc = theApp.m_pDocTemplate; // App에서 멤버 포인터를 가져온다. pTemplateDoc->OpenDocumentFile(NULL); // 새창에 연다.​ m_pDocTemplate = new CMultiDocTemplate(IDR_DBAppTYPE, RUNTIME_CLASS(CDBAppDoc), RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CDBAppListView)); if (!m_pDocTemplate) return FALSE; AddDocTemplate(m_pDocTemplate); MDI에서 새창을 여는 것은 App에 선언된 메시지를 이용하는 방법이 가..

[MFC] 다이얼로그 캡션 변경

MFC에서 윈도우 창의 캡션을 변경하려면, 첫 번째로는 CMainFrame::PreCreateWindow에서 CREATESTRUCT를 변경하는 방법이 있다. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; cs.style &= ~(FWS_ADDTOTITLE); // 캡션이 파일 읽어오기 등으로 바뀌지 않도록 변경 cs.lpszName = _T("MY APPLICATION"); // 원하는 캡션 작성 return TRUE; } 두 번째는 그냥 CMainFrame에서 SetWindowText(캡션명)을 호출하면 된다. CMainFrame이 아니라 다른 곳에서 변경하고 싶..

[MFC] CEdit : 폰트와 텍스트 색깔 바꾸기 (예제)

CEdit는 기본적으로 부모의 폰트를 따라가게 된다. CEdit를 수정하는 것은 부모 창에서 조절하는 방법도 있지만 일괄로 나만의 스타일을 구축하기에는 번거롭다. 그래서 Subclassing하여 스타일을 만들어 놓으면 두고두고 쓸 수 있어 유용하다. CEdit를 Subclassing하는 CMxEdit를 만든다. 헤드 파일에 CFont 변수를 선언한 후, 생성자에 Font에 대한 데이터를 미리 넣어둔다. Set/Get 함수를 이용한 Font의 업데이트도 좋지만, 많이 사용하는 스타일로 미리 만들어 놓으면 사용 시 손이 덜가는 경우가 많다. 그리고 CEdit는 WM_CREATE 같은 이벤트가 발생하지 않기 때문에 초기화도 WM_PAINT나 WM_CTLCOLOR_REFLECT 같은 이벤트를 사용한다. Font..

코드/MFC 2021.05.19

[MFC] MFC 컨트롤 서브클래싱 하기

MFC에서 컨트롤을 커스터마이징 하려면 서브 클래싱을 기본적으로 사용할 수 있어야 한다. 앞으로 여러 컨트롤을 커스터마이징 하는 방법을 포스팅할 예정이기 때문에 우선 서브 클래싱 하여 클래스를 만드는 방법부터 알아보자. 사실 익숙해지면 그냥 코드 상에서 수정하는 편이 더 편하다. 1. 프로젝트 (우클릭) > 추가 (우클릭) > 클래스 를 누르면 아래와 같은 창이 뜬다. MFC 콘트롤을 서브 클래싱 할 예정이므로 MFC Class를 선택한다. 2. Class Name은 새롭게 만들 클래스 이름이며, Base Class는 서브 클래싱 할 클래스 이름이다. 3. 생성된 클래스는 Base class를 상속한 형태로 만들어진다. 예로 CEdit를 Base Class로 하는 CMxEdit를 만들어 보았다. // C..

[MFC] CDockingPane Class 사용하기

예전에 그냥 쓰던 DockingPane을 사용하려고 하니 계속 Error가 발생했다. 여기저기 찾아봐도 그냥 사용하는 법만 있고 어떻게 사용해야 되는지는 생략되어 있었다. ( 그만큼 기본적이라는 건가.. ) 그래서 MFC의 CDockingPane을 적용하는 법을 정리해 둔다. Window : 유리들이 창틀에 끼여 집합된 창 Pane : 그냥 유리 한 장 Floating Pane : 떠다니는 유리 한 장 ( 어느 Window에도 끼어넣을 수 있는.. ) CDockingPane class를 MainFrame에 사용하려면 기존의 상속된 CFrameWnd(혹은 CMDIFrameWnd)를 사용할 수 없다. 상속받는 class를 CFrameWndEx(혹은 CMDIFrameWndEx)로 변경해야 한다. class C..

[SQLite] VSCode에서 SQLite 사용하기

VSCode에서 SQLite를 사용하는 것이 가능하다. 우선 SQLite로 만들어진 *.db3 파일을 VSCode로 연결하면 확장팩에서 SQLite를 추천해준다. 그것이 아니라면 확장팩 검색을 하자. '설치'를 눌러주면 자동으로 설치해 준다. 설치가 끝나면 MySQL Workbench처럼 바로바로 사용할 수 있을 줄 알았는데 그것은 아닌 것 같았다. [SQLite] SQLite 설치 및 사용 준비 SQLite는 클라이언트 응용 프로그램에 임베디드 되어 동작하는 Open Source DBMS이다. SQLite는 '경량화' 되어 있는 DB이며 파일을 기반으로 하기 때문에 데이터베이스의 백업 역시 파일을 통째로 복사하 stormpy.tistory.com Database 파일 여는 방법 1. 명령 팔레트 명령을..

DB/SQLite 2021.05.14

[SQLite] SQLite 설치 및 사용 준비

SQLite는 클라이언트 응용 프로그램에 임베디드 되어 동작하는 Open Source DBMS이다. SQLite는 '경량화' 되어 있는 DB이며 파일을 기반으로 하기 때문에 데이터베이스의 백업 역시 파일을 통째로 복사하면 된다. 또한 모든 기능을 라이브러리 내에서 구동할 수 있기 때문에 따로 미들웨어를 쓰지 않아도 된다. 경량화를 목적으로 두고 있기 때문에 복잡하거나 큰 데이터를 보관하는 데에는 적절치 않다. 또한 Unicode만 사용할 수 있다. 개발 당시부터 이지스함에서 구동되던 탓에 자질구레한 기능은 없다. SQLite를 사용하려면 우선 관련 파일을 받아야 한다. 공식 사이트에 접속하여 해당 파일을 다운로드 하자. SQLite Download Page Templates (1) and (2) are ..

DB/SQLite 2021.05.14

[MySQL] REPLACE 문자열 일괄 변경

PRIMARY KEY를 복수개를 사용할 경우, 외래키를 사용하는 것이 쉽지 않다. 그럴 경우에는 데이터의 무결성을 지켜기 위해서 CASCADE를 직접 구현해야 할 때가 있다. 그 중에서 UPDATE의 경우에 'REPLACE'라는 명령어를 사용하면 쉽게 구현할 수 있다. Column에서 특정 문자를 변경해서 표시할 경우 SELECT REPLACE(필드명, TARGET, NEW) FROM 테이블명; Column의 특정 문자를 변경해서 업데이트 할 경우 UPDATE 테이블명 SET 필드명 = REPLACE(필드명, TARGET, NEW); 상기와 같은 명령을 실행하게 되면 테이블에서 TARGET 데이터가 NEW 데이터로 일괄 변경되어 버린다. 이 때 특정 조건을 이용하여 변경될 데이터를 제약할 수 있다. UP..

DB/MySQL 2021.05.03

[MySQL] LEAVE , 프로시저 중에 중단하기

프로시저를 진행 중에 조건을 만족하지 않을 경우 실행을 중단하고 싶은 경우가 있다. 프로시저는 함수처럼 RETURN이 없어서 IF ~ END IF로 조건문으로 감싸서 해결하였는데 LEAVE를 사용하면 쉽게 해결할 수 있다. 프로시저를 시작하는 BEGIN 앞에 BLOCK의 이름을 넣어주면 LEAVE [BLOCK이름]을 사용하여 종료할 수 있다. DELIMITER $$ CREATE PROCEDURE SP_insert_block( IN mcdomain VARCHAR(13), IN seqblkID VARCHAR(256) ) PROC_BODY : BEGIN -- BLOCK NAME 설정 DECLARE sqlmcdomain VARCHAR(13); IF NOT CHAR_LENGTH(mcdomain) = 13 THEN..

DB/MySQL 2021.04.27

[MySQL] REGEXP_REPLACE 한글, 영문, 특수문자, 숫자 제거

REGEXP_REPLACE는 MySQL 8.0 이상부터 사용 가능하다. 정규식을 통해 한글, 영문, 특수문자, 숫자를 제거하는 방법은 아래와 같다. SELECT REGEXP_REPLACE(대상 문자열, 대상 문자열, 변경 문자열) AS 닉네임; -- 한글제거 SELECT REGEXP_REPLACE('abcd(1234)가나다라', '[가-힣]', '') AS nickname; -- 숫자제거 SELECT REGEXP_REPLACE('abcd(1234)가나다라', '[0-9]', '') AS nickname; -- 영문제거 SELECT REGEXP_REPLACE('abcd(1234)가나다라', '[a-z]', '') AS nickname; -- 특수문자제거 (특정문자) SELECT REGEXP_REPLACE(..

DB/MySQL 2021.04.27

[Ubuntu 20.04] MySQL설치

1. 현재 상태를 업데이트 및 설치 실행 $sudo apt-get update $sudo apt-get install mysql-server 2. 기본세팅 $sudo ufw allow mysql -- 외부접속 기능 활성화 $sudo systemctl start mysql -- 서비스 시작 $sudo systemctl enable mysql -- 서버 재시작 시 mysql 재시작 3. 접속 $sudo /usr/bin/mysql -u root -p su 상태에서는 mysql만 작성해도 접속됨. ( 초기 비밀번호는 Ubuntu 비번과 동일 ) 4. Version 확인 mysql> show variables like "%version%"; 5. 비밀번호 변경 방법 mysql> SET PASSWORD FOR 'r..

운영체제/Ubuntu 2021.04.25

[MySQL] CHECK문을 이용한 제약 조건 설정

CHECK 제약 조건 COLUMN에 들어갈 수 있는 값을 제한 부호, 숫자 비교, 문자 비교 등을 비교할 수 있다. 입력되는 값이 CHECK 조건과 맞지 않으면 에러가 발생한다. -- 출생년도가 1900년 이후, 2023년 이전으로 제한 -- 이름은 반드시 기입해야 한다. CREATE TABLE userTBL ( userID CHAR(8) PRIMARY KEY, name VARCHAR(10), birthYear INT CHECK (birthYear >= 1900 AND birthYear

DB/MySQL 2021.04.23

[Ubuntu 20.04] root 계정 활성화

리눅스에서는 보안 상 최고 관리자 계정인 root를 활성화 시켜놓지 않는다. 리눅스는 서버로 이용하기 위한 경우가 많기 때문에 root 계정의 보안이 중요하다. 그래서 최고 권한을 얻기 위해서는 터미널 명령에 접두사 sudo를 붙여 명령어를 쓰게 된다. 하지만 매번 sudo를 붙여 적는 것은 은근히 귀찮은 일이다. 그래서 개인적으로 이용한다면 root 계정을 활성화시켜 놓는 편이 편리하다. root 계정 암호 설정하기 root 계정을 활성화 시키기 위해서는 root 계정의 암호를 설정해야 한다. $sudo passwd root 실행을 하게 되면 아래와 같이 출력되며, 새로운 암호를 설정하면 된다. $su 위와 같은 명령어를 실행하면 암호를 요구하는데, 위에서 설정한 암호를 넣어주면 된다. su (Subs..

운영체제/Ubuntu 2021.04.22
728x90
반응형