VS 2019 C++구현 첫 번 째 MFC 프로그램

13984 단어 C++MFC 프로그램
프로젝트 생 성

그리고 다음 단 계 를 누 르 고 항목 을 설정 합 니 다.여기 서 제 이름 은 my firtmfc 입 니 다.

생 성 단 추 를 누 르 고 아래 대화 상 자 를 팝 업 합 니 다.

위의 MFC 응용 프로그램 을 설정 합 니 다.다음 과 같 습 니 다.

클릭 완성,아래 창 생 성.

첫 번 째 컴 파일 로 생 성 된 기본 항목 을 다음 인터페이스 로 가 져 옵 니 다.

VS 2019 인터페이스 를 클릭 하여"솔 루 션 자원 관리자"

여기까지 프로젝트 가 완공 되 고 컴 파일 이 통과 되 었 습 니 다.
2.사용자 정의 기능 추가(일반적인 그림 을 예 로 들 면)
자원 보 기 를 누 르 면 이 컨트롤 은 뒤에서 조작 해 야 합 니 다.

IDR 더 블 클릭MAINFRAME,여기에 그림 그리 기 기능 을 추가 할 수 있 습 니 다.

Ribbon 에 그림 그리 기 기능 을 추가 할 수도 있어 요.

그리고 도구 상자->RIbbon 편집기 클릭:

Ribbon 의 패 널 컨트롤 을 더 블 클릭 합 니 다.

이름 을 모양 으로 바 꾸 고 단추 컨트롤 을 추가 합 니 다.이름 을 사각형 으로 바 꿉 니 다.

사각형 의 잡다 한 항목 을 수정 하고 ID 는 ID 로 변경 합 니 다.RECTANGLE

오른쪽 단추 사각형 버튼,이벤트 처리 프로그램 추가 선택

다음 창 가 져 오기

이 팝 업 창 설정:

확인 을 클릭 한 후,우 리 는 아래 의 코드 를 얻 었 다.
아래 내용 참조https://www.jb51.net/article/214347.htm
처음으로 c++를 사 용 했 는데 mfc 의 많은 함수 가 익숙 하지 않 아서 바로 사용 했다.
graph.cpp 원본 파일 을 새로 만 듭 니 다.



#include "framework.h"
#include "pch.h"
 
IMPLEMENT_SERIAL(graph, CObject, 1)
graph::graph(int l, int u, int r, int d)
{
    left = l;
    up = u;
    right = r;
    down = d;
    state = 0;
    fcolor = 0xffffff;
}
 
void graph::Offset(int cx, int cy)
{
    left += cx;
    right += cx;
    up += cy;
    down += cy;
}
 
void graph::onPress(int x, int y)
{
    sx = x; sy = y;
    state = 0;
    //    
    if (left < x && x < right &&
        up < y && y < down) {
        state = 1;
        return;
    }
    if (left - f_width / 2 < x && x < left + f_width / 2)    state |= 2;    //        
    if (up - f_width / 2 < y && y < up + f_width / 2)    state |= 4;//    
    if (right - f_width / 2 < x && x < right + f_width / 2)    state |= 8;//    
    if (down - f_width / 2 < y && y < down + f_width / 2)    state |= 16;    //        
 
}
 
void graph::onRelease(int x, int y)
{
    state = 0;
}
 
 
void graph::SetBorderColor(int color)
{
    fcolor = color;
}
 
void graph::SetFillColor(int color)
{
    bcolor = color;
}
int graph::onMove(int x, int y)
{
    int cx, cy;
    cx = x - sx; cy = y - sy;
    sx = x; sy = y;
 
    if (state == 1) {
        Offset(cx, cy);        //     cx,cy
    }
 
    if (2 == (state & 2)) {
        left = x;
 
    }
 
    if (4 == (state & 4)) {
        up = y;
 
    }
 
    if (8 == (state & 8)) {
        right = x;
 
    }
 
    if (16 == (state & 16)) {
        down = y;
 
    }
    return state == 0 ? 0 : 1;
}
void graph::Serialize(CArchive& ar)
{
    CObject::Serialize(ar);
    if (ar.IsLoading()) {
        ar >> left >> right >> up >> down >> f_width >> fcolor >> bcolor;
    }
    else
    {
        ar << left << right << up << down << f_width << fcolor << bcolor;
    }
}
graph::~graph()
{
}
void graph::onDraw(CDC* pDC) {
    CBrush b(fcolor);
    pDC->SelectObject(&b);
    CRect r(left, up, right, down);
    pDC->FillRect(&r, &b);
    CPen p(PS_SOLID, 1, bcolor);
    pDC->SelectObject(&p);
    pDC->Rectangle(left, up, right, down);
    pDC->MoveTo(left, up);
    pDC->DrawText(_T("   "), -1, new CRect(left, up, right, down), DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
항목 에 헤더 파일 graphz.h 추가




graph.h 에 다음 코드 를 추가 합 니 다:

#pragma once
 
class graph :
	public CObject
{
protected:
	//  
	DECLARE_SERIAL(graph)
	int left, up, right, down;
	//    
	unsigned int state;
	int sx, sy;
	int  f_width = 5;
	int fcolor = 0xffffff, bcolor = 0;
 
public:
	graph() :graph(50, 50, 100, 100) {
 
	}
	graph(int l, int u, int r, int d);
	void Offset(int cx, int cy);
	void  onPress(int x, int y);	//      
	int  onMove(int cx, int cy);	//      
	void  onRelease(int x, int y);	//      
	virtual void onDraw(CDC* pDC);
	virtual int getGraphID() { return 0; }
	virtual void Serialize(CArchive& ar);
	void SetFillColor(int color);
	void SetBorderColor(int color);
	~graph();
 
};
framework.h 에 graph.h 추가

#include "graph.h"
우 리 는 직사각형 을 그 려 야 한다.여기에 사각형 의 관련 코드 를 추가 하고,
위의 절차 와 마찬가지 로 rectangle.h 와 rectangle.cpp 를 볼 수 있 습 니 다.
rectangle.cpp

#include "framework.h"
#include "pch.h"
rectangle::rectangle(int l, int u, int r, int d) :graph(l, u, r, d)
{
    state = 0;
    fcolor = 0xffffff;
 
}
 
void rectangle::onDraw(CDC* pDC)
{
    CBrush b(fcolor);
    pDC->SelectObject(&b);
    CRect r(left, up, right, down);
    pDC->FillRect(&r, &b);
    CPen p(PS_SOLID, 1, bcolor);
    pDC->SelectObject(&p);
    pDC->Rectangle(left, up, right, down);
    pDC->MoveTo(left, up);
}
 
rectangle::~rectangle()
{
}
rectangle.h

#include "graph.h"
class rectangle :
    public graph
{
public:
    //DECLARE_SERIAL(graph)
    //void Serialize(CArchive& ar);
    rectangle() :graph(50, 50, 100, 100) {}
    rectangle(int l, int u, int r, int d);
    void onDraw(CDC* pDC);
    int getGraphID() { return 2; }
    ~rectangle();
};
그리고 my firstmfcDoc.h 에 list 를 추가 합 니 다.

std::list<graph*> graphList;
list 를 호출 했 기 때문에 framework.h 에 추가 합 니 다.

#include <list>

OnRectangle()함수 로 이전에 생 성 된 함 수 를 호출 하려 면 다음 코드 를 추가 합 니 다.

    CmyfisrtmfcDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
    pDoc->graphList.push_front(new rectangle(50, 50, 100, 100));
 
    Invalidate();
myfirstmfcview.cpp 의 OnDraw 함 수 를 다음 과 같이 수정 합 니 다.

void CmyfisrtmfcView::OnDraw(CDC* pDC)
{
    CmyfisrtmfcDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
 
    // TODO:               
    std::list<graph*>::iterator v;
    for (v = pDoc->graphList.begin(); v != pDoc->graphList.end(); ++v) {
        (*v)->onDraw(pDC);
    }
}
다음은 클래스 마법사 로 메 시 지 를 추가 합 니 다.


마우스 왼쪽 단 추 를 누 르 고 메 시 지 를 누 르 고 왼쪽 단 추 를 누 르 면 메 시 지 를 풀 고 마우스 로 메 시 지 를 이동 합 니 다.

생 성 된 버튼 누 르 기 함수 에서

void CmyfisrtmfcView::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO:              /      
    CmyfisrtmfcDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
 
    // TODO:               
    std::list<graph*>::iterator v;
    for (v = pDoc->graphList.begin(); v != pDoc->graphList.end(); ++v) {
        (*v)->onPress(point.x, point.y);
    }
    Invalidate();
    //CView::OnLButtonDown(nFlags, point);
}
위 와 같은 방식.


생 성 된 코드 는 my firstmfcview 에서 다음 과 같 습 니 다.

void CmyfisrtmfcView::OnLButtonUp(UINT nFlags, CPoint point)
{
    // TODO:              /      
    CmyfisrtmfcDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
 
    // TODO:               
    std::list<graph*>::iterator v;
    for (v = pDoc->graphList.begin(); v != pDoc->graphList.end(); ++v) {
        (*v)->onRelease(point.x, point.y);
    }
 
    //CView::OnLButtonUp(nFlags, point);
}
 
 
void CmyfisrtmfcView::OnMouseMove(UINT nFlags, CPoint point)
{
    // TODO:              /      
    CmyfisrtmfcDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
 
    // TODO:               
    std::list<graph*>::iterator v;
    for (v = pDoc->graphList.begin(); v != pDoc->graphList.end(); ++v) {
        (*v)->onMove(point.x, point.y);
    }
    Invalidate();
//    CView::OnMouseMove(nFlags, point);
}
여기까지 모든 일 을 완 성 했 으 니 번역 을 진행 할 수 있다.

아래 도형 을 생 성 합 니 다.사각형 은 이동 할 수 있 고 스 트 레 칭 이 가능 합 니 다.

항목 의 속성 을 클릭 하고 설정 속성 에서 고급 을 선택 하 십시오.MFC 는 정적 라 이브 러 리 를 사용 합 니 다.한 번 컴 파일 하면.exe 를 생 성 할 수 있 습 니 다.다른 컴퓨터 에서 동적 라 이브 러 리 에 의존 하지 않 아 도 열 수 있 습 니 다.


요약:
1.프로젝트 프로젝트 를 추가 하 는 법 을 배 웠 습 니 다.
2.사용자 의 원본 파일 과 헤더 파일 을 추가 하고 프로젝트 와 연결 하 는 것 을 배 웠 습 니 다.
3.클래스 가 이 드 를 배 웠 다
4.버튼 컨트롤 생 성 을 배 웠 습 니 다.메시지 ID 를 통 해 함수 와 연 결 됩 니 다.
참고 문헌:
(1) vs 2019 MFC 오 피 스 인터페이스 구현 그래 픽 프로젝트(초 특급 상세)
(2) vs 2019 에서 MFC 를 사용 하여 간단 한 windows 창 프로그램 을 빠르게 구축 합 니 다.
VS 2019 C++구현 에 관 한 첫 번 째 MFC 프로그램 에 관 한 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C++첫 번 째 MFC 프로그램 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기