用c++实现一个简单的菜单程序_c++c++c++c++编写程序:给你4个整数,请算出24。 - CSDN
  • 在系统盘里点击鼠标右键会出现删除,剪切之类的操作,请问如何用c++编写一个菜单程序呢。
  • 种方案:使用if……else和break,continue控制程序流程 #include #include using namespace std; int main() { char choose,ch; while(1) { cout(dd) D(elete) S(ort) Q(uit),Select one: ";
    第一种方案:使用if……else和break,continue控制程序流程
    #include<iostream>
    #include<cstdlib>
    using namespace std;
    
    
    int main()
    {
         char choose,ch;
         while(1)
         {
            cout<<"Menu: A(dd) D(elete) S(ort) Q(uit),Select one: ";
            cin>>ch;
            choose=toupper(ch);
            if(choose=='A')
            {
               cout<<"数据已被增加!"<<endl;
               continue;
            }
            else if(choose=='D')
            {
               cout<<"数据已被减少!"<<endl;
               continue;
            }
            else if(choose=='S')
            {
               cout<<"数据已经排序!"<<endl;
               continue;
            }
            else if(choose=='Q')
               break;
          }
          return(1);
    }


    第二种方案:使用switch语句

    #include<iostream>
    #include<cstdlib>
    using namespace std;
    
    
    int main()
    {
         char choose;
         while(1)
         {
            cout<<"Menu: A(dd) D(elete) S(ort) Q(uit),Select one: ";
            cin>>choose;
            switch(toupper(choose))
            {
               case 'A':
                        cout<<"数据已被增加!"<<endl;
                        break;
               case 'D':
                        cout<<"数据已被删除!"<<endl;
                        break;
               case 'S':
                        cout<<"数据已经排序!"<<endl;
                        break;
               case 'Q':
                        exit(0);
                        break;
               default:
                        cout<<"选择错误,请重新选择!"<<endl;
            }
         }
         return(0);
    }

    —————————————————————————————————

    本文原创自Sliencecsdn技术博客。

    本博客所有原创文章请以链接形式注明出处。

    欢迎关注本技术博客,本博客的文章会不定期更新。


    大多数人想要改造这个世界,但却罕有人想改造自己。

    世上没有绝望的处境,只有对处境绝望的人。

                                                  ————By slience

    —————————————————————————————————


    展开全文
  • C++实现通讯录 vector 和 迭代器使用的一点注意事项

        有了一定的C基础之后,目前正在学习C++,今天尝试用面向对象的思想编写了一个简单的通讯录(之前在C的练习中做过类似的项目)

    通过不停的敲代码,出现问题也解决问题的过程中也稍微总结了一下新的知识。


    遇到的第一个问题即是,我自定义了一个Person类用来存放每个联系人的信息,然而在创建了一个容器vector<Person>V(0)后,

    查阅了一下其他大神博客中写的demo,发现都是用存放基本类型int来举例子,初始化直接用V.push_back(int)就可以,但是自定义的类中,私有成员不止一个,但是这个函数我在用的过程中发现能且只能传一个参数,也就是只能初始化一个私有成员,其他私有成员只能通过默认构造函数初始化,其他的私有成员只能通过赋值的方式再去重新写入。


    第二个问题,再用vector<Person>::iterator iter 迭代器遍历的时候,如果要删除某个元素,或者用Vector.push_back()插入一个元素的时候,迭代器就会失效。这时候如果不重置迭代器,iter会相当于一个野指针,编译器也会报类似的错误。


    下面贴上我写的代码:

    #include <iostream>
    #include <vector>
    #include <map>
    #include "addr_book.h"


    using namespace std;




    int main()
    {
        Tool T;
    T.enter_menu();


    vector<Person>V(0);
    //map<int,Person>M;
    //map<int,Person>::iterator it;


        int n;
    int count;
    char name[20];
    int tel;
    //Person P;

    while(1)

       count = 0;
    memset(name,0,sizeof(name));
       cout << "请输入操作命令:";
       cin >> n;
     
       switch (n)
            {
           case 1:
       {
       cout << "请输入联系人姓名:";
       cin >> name;
       cout << "请输入联系人电话:";
       cin >> tel;
       V.push_back(name);
                    (V.back()).Tel(tel);

    break;
       }


    case 2:
    {
       if(V.capacity() == 0)
    {
       cout << "未录入联系人!" << endl;
    break;
    }
    cout << "请输入查找的联系人姓名:";
                    cin >> name;
       
    for(vector<Person>::iterator it = V.begin(); it != V.end();++it)
    {
       count = ((*it).Compare(name,count));
    }
       if(count == 0)
    {
       cout << "查无此人!" << endl;
    }

                    break;
    }


    case 3:
    {
       if(V.capacity() == 0)
    {
       cout << "未录入联系人!" << endl;
    break;
    }


       for(vector<Person>::iterator it = V.begin(); it != V.end(); ++it)
    {
       (*it).Display();
    }

    break;
    }


    case 4:
    {
       if(V.capacity() == 0)
    {
       cout << "未录入联系人!" << endl;
    break;
    }
    cout << "请输入要修改的联系人姓名:";
    cin >> name;
    for(vector<Person>::iterator it = V.begin(); it != V.end();++it)
                    {
       count = ((*it).Update(name,count));
    }

       if(count == 0)
    {
       cout << "查无此人!" << endl;
    }
       break;
                }
                
                case 5:
    {
       if(V.capacity() == 0)
    {
       cout << "未录入联系人!" << endl;
    break;
    }

    cout << "请输入要删除的联系人姓名:";
    cin >> name;

    for(vector<Person>::iterator it = V.begin(); it != V.end();++it)
                    {
       int i = ((*it).Delete(name));
    if(i == 0)
    {
       V.erase(it);
    cout << "删除成功!" << endl;
    count++;
    break;
    }
    }


    if(count == 0)
    {
       cout << "查无此人!" << endl;
    }

                break;  
    }
                
    case 6:
    {
       return 0;
    }


    case 0:
    {
       T.enter_menu();
    break;
    }


    default:
    {   
       cout << "输入有误,请重输!" << endl;
       break;
    }
       }
    }


        return 0;
    }








    #ifndef _ADDR_BOOK_H
    #define _ADDR_BOOK_H
    #include <vector>
    class Person
    {
    public:
        Person();
    Person(char *name);
    Person(int tel);
    Person(int tel,char *name);
    Person(char *name,int tel);
    void Tel(int tel);
    void Display();
    ~Person();
    int Compare(char *name,int count);
    int Update(char *name,int count);
    int Delete(char *name);
    //friend void search(char *name,vector<Person> V);
    private:
        char name_[20];
    int tel_;
    };


    class Tool
    {
    public:
        Tool();
    ~Tool();
    void enter_menu();
    private:
    };


    #endif










    #include <iostream>
    #include <vector>
    #include <string.h>
    #include "addr_book.h"


    using namespace std;


    #include <string.h>


    Person::Person()
    {
        *name_ = '\0';
    tel_ = 0;
    }


    Person::Person(int tel)
    {
        tel_ = tel;
    }


    Person::Person(char *name)
    {
        //name_ = name;
    strcpy(name_,name);
    }


    Person::Person(int tel, char *name)
    {
        tel_ = tel;
    //name_ = name;


    }


    Person::Person(char *name,int tel)
    {
        tel_ = tel;
    //name_ = name;
    strcpy(name_,name);
    }


    void Person::Tel(int tel)
    {
        tel_ = tel;
    }


    void Person::Display()
    {
        cout << name_ << "    " << tel_ << endl;
    }


    Person::~Person()
    {
    }


    int Person::Compare(char *name,int count)
    {
        if(strcmp(name,name_) == 0)
    {
       Display();
    count++;
    }


    else
    {
       return count;
    }
    }


    int Person::Update(char *name,int count)
    {
        if(strcmp(name,name_) == 0)
    {
       Display();
    cout <<"请输入修改后的姓名:";
    cin >> name_;
    cout << "请输入修改后的手机号码:";
    cin >>tel_;
    count++;
    }
        else
    {
       return count;
    }
    }


    int Person::Delete(char *name)
    {
        if(strcmp(name,name_) == 0)
    {
       return 0;
    }
    return -1;
    }


    /*****************************华美的分割线***********************/


    /*void search(char *name,vector<Person> V)
    {
        int count = 0;
    for(vector<Person>::iterator it = V.begin(); it != V.end; ++it)
    {
       if(strcmp(name,(*it).name_) == 0)
    {
       (*it).Display;
    count++;
    }
    }
    if(count == 0)
    {
       cout << "查无此人" <<endl;
    }
    }*/


    /*****************************华美的分割线***********************/


    Tool::Tool()
    {
    }


    Tool::~Tool()
    {
    }


    void Tool::enter_menu()
    {
        cout << endl;
    cout << ("        *******欢迎使用通讯录*******") << endl;
    cout << ("        *                                      *") << endl;
    cout << ("        *1.          添加联系人信息            *") << endl;
    cout << ("        *2.          查找联系人信息            *") << endl;
    cout << ("        *3.          显示联系人信息            *") << endl;
    cout << ("        *4.          修改联系人信息            *") << endl;
    cout << ("        *5.          删除联系人信息            *") << endl;
    cout << ("        *6.               退出                 *") << endl;
    cout << ("        *7.                                    *") << endl;
    cout << ("        *8.          按0呼出主菜单             *") << endl;
    cout << ("        *********************") << endl;
    cout << endl;
    }




    展开全文
  • C++菜单制作

    2020-07-27 23:33:31
    一个简易程序,用来制作c++菜单,是制作菜单时更为方便。
  • 题目:用c++模拟实现一个学生成绩的信息管理系统,要求能添加、删除、修改、查看和保存学生的信息等功能 源代码如下: #define _CRT_SECURE_NO_WARNINGS #include using namespace std; #include #include class ...

    题目:用c++模拟实现一个学生成绩的信息管理系统,要求能添加、删除、修改、查看和保存学生的信息等功能

    源代码如下:

    #define  _CRT_SECURE_NO_WARNINGS
    
    #include<iostream>
    using namespace std;
    #include<string.h>
    #include<fstream>
    
    class student
    {
    private:
    	student* next;
    public:
    	char stu_num[15];                  //学号
    	char stu_name[30];                //姓名
    	float stu_score;                      //成绩
    
    	void afterInsert(student *p);//在该节点后插入一个节点
    	void afterDelete();//在该节点后删除一个节点
    	
    	student *getNext()//获得下一个节点的指针
    	{ 
    		return next; 
    	}
    
    	/***********查询学生信息************/
    	void getMage();
    
    	/******学生信息修改******/
    	void changeMage(int n, char *ptr);
    	void changegrade(float p);
    
    	/******构造*****/
    	student(char *num, char *name, float score);
    	student();
    };
    
    void student::changegrade(float p)
    {
    	stu_score = p;
    }
    
    student::student()           //构造
    {
    	strcpy(stu_num, "\0");
    	strcpy(stu_name, "\0");
    	stu_score = 0;
    	next = '\0';
    }
    
    student::student(char *num, char *name, float score)
    {
    	strcpy(stu_num, num);
    	strcpy(stu_name, name);
    	stu_score = score;
    	next = '\0';
    }
    
    void student::afterInsert(student *p)//插入节点
    {
    	p->next = next;
    	next = p;
    }
    
    void student::afterDelete()        //删除节点
    {
    	student *p = next;
    	next = p->next;
    	delete p;
    }
    
    void student::getMage()             //获得信息
    {
    	cout << "学号:" << stu_num << "      姓名:" << stu_name;
    	cout << "      c++成绩:" << stu_score << endl;
    }
    
    void student::changeMage(int n, char *ptr)
    {
    	switch (n)
    	{
    	case 1: strcpy(stu_num, ptr); 
    		break;
    	case 2: strcpy(stu_name, ptr);
    	}
    }
    
    //建立链表函数
    void  construct_list(student *tail)
    {
    	student *p = new student;
    	char very[20];
    	float achieve;
    	cout << "请输入学号:" << endl;
    	cin >> very;
    	p->changeMage(1, very);
    	cout << "请输入姓名:" << endl;
    	cin >> very;
    	p->changeMage(2, very);
    	cout << "请输入c++成绩:" << endl;
    	cin >> achieve;
    	p->changegrade(achieve);
    	system("cls");
    	cout << "信息输入完毕" << endl;
    
    	for (; tail->getNext() != '\0';)
    	{
    		tail = tail->getNext();
    	}
    
    	tail->afterInsert(p);
    }
    
    /*********查询信息*********/
    student *findmege(student *head)
    {
    loop:
    	cout << "1--按姓名查询           2--按学号查询              q--返回上一级菜单" << endl;
    	char p[5], ptr[20];
    	student *mid = head;
    	cin >> p;
    
    	if (p[0] != '1'&&p[0] != '2'&&p[0] != 'q' || strlen(p)>1)
    	{
    		system("cls");
    		cout << "对不起,你的输入有误,请重新输入!" << endl;
    		goto loop;
    	}
    
    	switch (p[0])
    	{
    	case '1':
    	{
    		system("cls");
    		cout << "请输入要查找的姓名:" << endl;
    		cin >> ptr;
    
    		for (; strcmp(ptr, mid->stu_name) != 0; mid = mid->getNext())
    		{
    			if (mid->getNext() == '\0')
    			{
    				cout << "对不起,你要查找的人不存在,请确认你的输入是否正确!" << endl;
    				goto loop;
    			}
    		}
    		return mid;
    	}
    	case '2':
    	{
    		system("cls");
    		cout << "请输入您要查找的学号:" << endl;
    		cin >> ptr;
    		for (; strcmp(ptr, mid->stu_num) != 0; mid = mid->getNext())
    		{
    			if (mid->getNext() == '\0')
    			{
    				cout << "对不起,您要查找的内容不存在,请确认您的输入是否正确!" << endl;
    				goto loop;
    			}
    		}
    		return mid;
    	}
    	case 'q': 
    	{
    		return '\0';
    	}
    	default:
    	{
    		system("cls");
    		cout << "对不起,您的输入有误,请重新输入!" << endl;
    		goto loop;
    	}
    	}
    }
    
    /******************删除链表 节点***********************/
    void delete_list(student *head)
    {
    	student *p = '\0';
    	char selet[4];
    	system("cls");
    	cout << "在删除前,系统会根据您的提示找到您要删除的学生信息!" << endl;
    	p = findmege(head);
    	if (p != '\0')
    	{
    		cout << "确认要删除吗(yes/任意键返回)" << endl;
    		cin >> selet;
    
    		if (strcmp(selet, "yes") == 0)
    		{
    			for (; head->getNext() != p; head = head->getNext());
    			head->afterDelete();
    			system("cls");
    			cout << "该信息删除成功!" << endl;
    		}
    	}
    }
    
    /*******************修改节点信息********************/
    void change_info(student *head)
    {
    	system("cls");
    	cout << "在您修改前,系统会根据您提供的信息找的您要修改的信息:" << endl;
    	student *p = '\0';
    
    	float achieve;
    	p = findmege(head);
    	if (p != '\0')
    	{
    		cout << "请输入c++成绩:" << endl;
    		cin >> achieve;
    		p->changegrade(achieve);
    		system("cls");
    		cout << "修改成功!" << endl;
    	}
    
    }
    
    /**************输出学生成绩信息**************/
    void output(student *head)
    {
    	system("cls");
    	cout << "1-查看指定学生信息;2-查看所有学生信息;3-分段输出学生信息" << endl;
    	char ch;
    	int n = 0;
    	head = head->getNext();
    	cin >> ch;
    	switch (ch)
    	{
    	case '1': 
    		head = findmege(head);
    		if (head == '\0')
    		{
    			break;
    		}
    		head->getMage();
    		break;
    	case '2': 
    	while (head)
    	{
    		head->getMage();
    		head = head->getNext();
    	}
    	break;
    	case '3': 
    		cout << "a-60分以下;b-60~70分之间;c-70~80分之间;d-80~90分之间;e-90~100分之间:" << endl;
    		cin >> ch;
    		switch (ch)
    		{
    		case 'a':
    		while (head)
    		{
    			if (head->stu_score <= 60)
    			{
    				head->getMage();
    				n++;
    			}
    			head = head->getNext();
    		}
    		 break;
    		case 'b': 
    		while (head)
    		{
    			if (head->stu_score>60 && head->stu_score <= 70) 
    			{ 
    				head->getMage();
    				n++; 
    			}
    			head = head->getNext();
    		}
    		break;
    		case 'c': 
    		while (head)
    		{
    			if (head->stu_score>70 && head->stu_score <= 80)
    			{ 
    				head->getMage(); 
    				n++; 
    			}
    			head = head->getNext();
    		}
    		break;
    		case 'd': 
    		while (head)
    		{
    			if (head->stu_score>80 && head->stu_score <= 90)
    			{
    				head->getMage();
    				n++;
    			}
    			head = head->getNext();
    		}
    		break;
    		case 'e': 
    		while (head)
    		{
    			if (head->stu_score>90 && head->stu_score <= 100)
    			{ 
    				head->getMage();
    				n++;
    			}
    			head = head->getNext();
    		}
    		}
    		if (n == 0)
    		{
    			cout << "该分段内没有您要找的学生信息" << endl;
    		}
    	}
    }
    
    /*****************主菜单************************/
    void mainmenu(student *head)
    {
    	char selet[10];
    	int n = 1;
    	ofstream outfile;
    	ifstream infile;
    	student *p, *ptr;
    	student *test = head, *mid;
    	cout << "*************************欢迎进入学生信息管理系统*************************" << endl;
    	do {
    		cout << "**************************************************************************" << endl;
    		cout << "1.插入信息;   2.删除信息;  3.修改信息; 4.查看信息; 5.保存  " << endl;
    		cout << "按'q'键退出      " << endl;
    		cout << "**************************************************************************" << endl;
    		cin >> selet;
    		if (((selet[0]<'1' || selet[0]>'6') && selet[0] != 'q') || strlen(selet)>1)
    		{
    			system("cls");
    			cout << "您的输入有误,请重新输入!" << endl;
    			break;
    		}
    		switch (selet[0])
    		{
    
    		case '1':
    			construct_list(head);
    			break; 
    		case '2': 
    			delete_list(head); 
    			break;
    		case '3': 
    			change_info(head);
    			break;
    		case '4': 
    			output(head);
    			break;
    		case '5':  
    			outfile.open("students.txt", ios::out | ios::app);
    			for (p = head->getNext(); p != '\0'; p = p->getNext())
    			{
    				outfile << p->stu_name << ' ';
    				outfile << p->stu_num << ' ';
    				outfile << p->stu_score << ' ';
    				outfile << endl;
    			}
    			outfile.close();
    			system("cls");
    			cout << "保存成功!" << endl;
    			break;
    		case 'q': 
    			break;
    		}
    	} while (selet[0] != 'q');
    }
    
    void main()
    {
    	student head;
    	mainmenu(&head);
    }
    
    运行结果部分截图:



    展开全文
  • **用C++编写一个简单的记事本 ** 记事本是每个操作系统最基础的软件之一。因为记事本操作方式简单便捷,也易于存储。那么,如何自己编写一个简单的记事本呢? 首先让我们来新建一个“main.h”的头文件。 代码如下: ...

    **用C++编写一个简单的记事本 **

    记事本是每个操作系统最基础的软件之一。因为记事本操作方式简单便捷,也易于存储。那么,如何自己编写一个简单的记事本呢?

    首先让我们来新建一个“main.h”的头文件。
    代码如下:

    #define CM_FILE_SAVEAS	9072		//保存文件
    #define CM_FILE_EXIT	9071		//退出
    #define CM_FILE_OPEN	9070		//打开文件
    #define CM_ABOUT        9069		//关于
    
    #define IDC_MAIN_TEXT 1001			//正文
    

    由于这只是一个非常简单的记事本,所以之开发了最基本的功能。有兴趣的朋友们还可以自己尝试一下哦!

    接下来就是菜单栏的代码了。头文件中写到的功能就隐藏在菜单栏中。注意:这个文件的后缀名为".rc",名字随便取,我这里取的是"resource.rc"
    源码:

    #include "main.h"
    MAINMENU MENU  {
    	POPUP "&File" {									//"File"栏功能
    		MENUITEM "&Open...", CM_FILE_OPEN			//打开
    		MENUITEM "Save &As...", CM_FILE_SAVEAS		//保存
    		MENUITEM SEPARATOR							//分割线
    		MENUITEM "E&xit", CM_FILE_EXIT				//退出
    	}
    	POPUP "&Help" {									//"Help"栏功能
    		MENUITEM "&About", CM_ABOUT					//关于
    	}
    }
    

    提示一下,代码中的MENUITEM是菜单选项的意思。

    重头戏来了,接下来就是它的核心代码了

    #include <windows.h>
    #include "main.h"
    
    BOOL LoadFile(HWND hEdit, LPSTR pszFileName) {		//载入文件
    	HANDLE hFile;
    	BOOL bSuccess = FALSE;
    
    	hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);		//创建文件
    	if(hFile != INVALID_HANDLE_VALUE) {
    		DWORD dwFileSize;
    		dwFileSize = GetFileSize(hFile, NULL);
    		if(dwFileSize != 0xFFFFFFFF) {
    			LPSTR pszFileText;
    			pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1);
    			if(pszFileText != NULL) {
    				DWORD dwRead;
    				if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL)) {
    					pszFileText[dwFileSize] = 0; 
    					if(SetWindowText(hEdit, pszFileText))
    						bSuccess = TRUE;
    				}
    				GlobalFree(pszFileText);
    			}
    		}
    		CloseHandle(hFile);
    	}
    	return bSuccess;
    }
    
    BOOL SaveFile(HWND hEdit, LPSTR pszFileName) {		//保存文件
    	HANDLE hFile;
    	BOOL bSuccess = FALSE;
    
    	hFile = CreateFile(pszFileName, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    	if(hFile != INVALID_HANDLE_VALUE) {
    		DWORD dwTextLength;
    		dwTextLength = GetWindowTextLength(hEdit);
    		if(dwTextLength > 0) {
    			LPSTR pszText;
    			pszText = (LPSTR)GlobalAlloc(GPTR, dwTextLength + 1);
    			if(pszText != NULL) {
    				if(GetWindowText(hEdit, pszText, dwTextLength + 1)) {
    					DWORD dwWritten;
    					if(WriteFile(hFile, pszText, dwTextLength, &dwWritten, NULL))
    						bSuccess = TRUE;
    				}
    				GlobalFree(pszText);
    			}
    		}
    		CloseHandle(hFile);
    	}
    	return bSuccess;
    }
    
    BOOL DoFileOpenSave(HWND hwnd, BOOL bSave) {		//打开或保存文件
    	OPENFILENAME ofn;
    	char szFileName[MAX_PATH];
    
    	ZeroMemory(&ofn, sizeof(ofn));
    	szFileName[0] = 0;
    
    	ofn.lStructSize = sizeof(ofn);
    	ofn.hwndOwner = hwnd;
    	ofn.lpstrFilter = "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0\0";	//搜索符合要求的文件(.txt或所有文件类型)
    	ofn.lpstrFile = szFileName;
    	ofn.nMaxFile = MAX_PATH;
    	ofn.lpstrDefExt = "txt";
    
    	if(bSave) {
    		ofn.Flags = OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT;
    		if(GetSaveFileName(&ofn)) {
    			if(!SaveFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName)) {
    				MessageBox(hwnd, "Save file failed.", "Error",MB_OK|MB_ICONEXCLAMATION);
    				return FALSE;
    			}
    		}
    	} else {
    		ofn.Flags = OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;
    		if(GetOpenFileName(&ofn)) {
    			if(!LoadFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName)) {
    				MessageBox(hwnd, "Load of file failed.", "Error",MB_OK|MB_ICONEXCLAMATION);
    				return FALSE;
    			}
    		}
    	}
    	return TRUE;
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
    	switch(Message) {
    		case WM_CREATE:
    			CreateWindow("EDIT", "",WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|ES_MULTILINE|ES_WANTRETURN,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,hwnd, (HMENU)IDC_MAIN_TEXT, GetModuleHandle(NULL), NULL);
    			SendDlgItemMessage(hwnd, IDC_MAIN_TEXT, WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE,0));
    			break;
    		case WM_SIZE:
    			if(wParam != SIZE_MINIMIZED)
    				MoveWindow(GetDlgItem(hwnd, IDC_MAIN_TEXT), 0, 0, LOWORD(lParam),HIWORD(lParam), TRUE);
    			break;
    		case WM_SETFOCUS:
    			SetFocus(GetDlgItem(hwnd, IDC_MAIN_TEXT));
    			break;
    		case WM_COMMAND:
    			switch(LOWORD(wParam)) {
    				case CM_FILE_OPEN:
    					DoFileOpenSave(hwnd, FALSE);
    					break;
    				case CM_FILE_SAVEAS:
    					DoFileOpenSave(hwnd, TRUE);
    					break;
    				case CM_FILE_EXIT:
    					PostMessage(hwnd, WM_CLOSE, 0, 0);
    					break;
    				case CM_ABOUT:
    					MessageBox (NULL, "File Editor for Windows!\nCreated using the Win32 API" , "About...", 0);		//点击"About"选项后弹出的弹窗显示内容
    					break;
    			}
    			break;
    		case WM_CLOSE:
    			DestroyWindow(hwnd);
    			break;
    		case WM_DESTROY:
    			PostQuitMessage(0);
    			break;
    		default:
    			return DefWindowProc(hwnd, Message, wParam, lParam);
    	}
    	return 0;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow) {
    	WNDCLASSEX wc;
    	HWND hwnd;
    	MSG Msg;
    
    	wc.cbSize        = sizeof(WNDCLASSEX);
    	wc.style         = 0;
    	wc.lpfnWndProc   = WndProc;
    	wc.cbClsExtra    = 0;
    	wc.cbWndExtra    = 0;
    	wc.hInstance     = hInstance;
    	wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    	wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    	wc.lpszMenuName  = "MAINMENU";
    	wc.lpszClassName = "WindowClass";
    	wc.hIconSm       = LoadIcon(hInstance,"A"); /* A is name used by project icons */
    
    	if(!RegisterClassEx(&wc)) {
    		MessageBox(0,"Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK|MB_SYSTEMMODAL);
    		return 0;
    	}
    
    	hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","File Editor Example Program",WS_OVERLAPPEDWINDOW,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		320,240,
    		NULL, NULL, hInstance, NULL);
    
    	if(hwnd == NULL) {
    		MessageBox(0, "Window Creation Failed!", "Error!",MB_ICONEXCLAMATION|MB_OK|MB_SYSTEMMODAL);
    		return 0;
    	}
    
    	ShowWindow(hwnd,1);
    	UpdateWindow(hwnd);
    
    	while(GetMessage(&Msg, NULL, 0, 0) > 0) {
    		TranslateMessage(&Msg);
    		DispatchMessage(&Msg);
    	}
    	return Msg.wParam;
    }
    

    以上就是这个最基本的记事本的编写方法。希望能帮到大家,谢谢!

    附:效果图
    在这里插入图片描述
    File栏
    Help栏
    About选项弹窗
    打开和保存文件

    展开全文
  • 两种用C++实现计算器界面设计的工程,qt-creator编辑,种是直接声明QWidget变量的方式,种是继承QWidget的方式。
  • 如何创建一个简单的Windows桌面应用程序 (C++)  最近刚开始学习C/C++开发Windows应用程序,这里将会以零基础的视角把学习过程完全记录下来。如果你也刚刚起步,那本文一定非常适合你。  进入正题,本文讨论...


    如何创建一个最简单的Windows桌面应用程序 (C++)


         最近刚开始学习C/C++开发Windows应用程序,这里将会以零基础的视角把学习过程完全记录下来。如果你也刚刚起步,那本文一定非常适合你。

         进入正题,本文讨论如何使用Visual Studio生成一个最简单的C窗体应用程序,并向用户显示Hello~

         下面我们一步步来介绍,对于涉及代码的地方,我们只介绍大体的框架,完整的代码会在文章最后给出。   

         创建基于 Win32 的项目

         1.在文件菜单上,单击新建,然后单击项目。

         2.在“新建项目”对话框的左窗格中,依次单击“已安装模板”和“Visual C++”,然后选择“Win32”。在中间窗格中,选择“Win32 项目”。在“名称”框中,键入项目名称,例如HelloApp。单击“确定”。

         3.在“Win32 应用程序向导”的欢迎页面中,单击“下一步”。在“应用程序设置”页的“应用程序类型”下,选择“Windows 应用程序”。 在“附加选项”下,选择“空项目”。 单击“完成”以创建项目。

         4.在“解决方案资源管理器”中,右键单击 HelloApp项目,然后依次单击“添加”和“新建项”。 在“添加新项”对话框中选择“C++ 文件(.cpp)”。 在“名称”框中,键入文件名,例如GT_HelloWorldWin32.cpp。单击“添加”。

         添加引用

         我们的应用程序需要使用许多现有定义才能完成所需功能,针对我们的需求,添加引用如下(其中前两个是必须的):

    #include <windows.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include <tchar.h> 

         WinMain函数     

         正如每个 C/C++控制台应用程序在起始点必须具有 main 函数,每个基于 Win32 的应用程序的函数也必须具有 WinMain 函数。WinMain就相当于是入口函数,并且具有固定的语法:

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow); 

         实现WinMain函数时内部逻辑大体相同,主要有以下几部分:

         1.创建描述窗体信息的窗口类结构WNDCLASSEX 

         如何创建一个 WNDCLASSEX 类型的窗口类结构?下面的代码演示了一个典型的窗口类结构WNDCLASSEX 的定义:

    //创建 WNDCLASSEX 类型的窗口类结构。 此结构包含关于窗口的信息
    	//例如应用程序图标、窗口背景色、标题栏中显示的名称、窗口过程函数的名称等。
    	WNDCLASSEX wcex; 
    	wcex.cbSize = sizeof(WNDCLASSEX); 
    	wcex.style          = CS_HREDRAW | CS_VREDRAW; 
    	wcex.lpfnWndProc    = WndProc; 
    	wcex.cbClsExtra     = 0; 
    	wcex.cbWndExtra     = 0; 
    	wcex.hInstance      = hInstance; 
    	wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); 
    	wcex.hCursor        = LoadCursor(NULL, IDC_ARROW); 
    	wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1); 
    	wcex.lpszMenuName   = NULL; 
    	wcex.lpszClassName  = szWindowClass; 
    	wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); 

         对于初学者,我们不用过分纠结代码的细节,暂时从宏观上把控。我们需要知道,此结构包含关于窗口的信息,例如应用程序图标、窗口背景色、标题栏中显示的名称、窗口过程函数的名称等。
         2.对窗口类进行注册

         现在已创建了窗口类,必须进行注册。

         使用 RegisterClassEx 函数,并将窗口类结构作为参数传递。

       RegisterClassEx(&wcex);

         3.创建并显示窗口

         现在需要使用CreateWindow函数创建窗口

         使用ShowWindow函数显示窗口

         这部分也很好理解,详见文末的代码

         4.侦听消息

         添加用于侦听操作系统所发送消息的消息循环。

         当应用程序收到一条消息时,此循环将该消息调度到 WndProc 函数。WndProc 函数用于对接收的消息进行处理,我们下面会介绍到。 

         该消息循环类似于以下代码:

    // Main message loop: 
    	// 添加用于侦听操作系统所发送消息的消息循环。 
    	// 当应用程序收到一条消息时,此循环将该消息调度到 WndProc 函数以进行处理。 
    	MSG msg; 
    	while (GetMessage(&msg, NULL, 0, 0)) { 
    		TranslateMessage(&msg); //翻译消息
    		DispatchMessage(&msg);  //派遣消息
    	} 

         WndProc 函数

         WndProc 函数用以处理应用程序收到的消息。

         首先需要判断收到的消息类型进而做出不同的处理,这需要使用 switch 语句。
         系统提供了众多的消息命令,例如 WM_PAINT 代表收到了绘图消息,而收到鼠标点击消息的标识是WM_LBUTTONDOWN...

         这里以处理 WM_PAINT 消息为例进行说明。

         要处理 WM_PAINT 消息,首先应调用 BeginPaint,然后处理所有的绘图逻辑,例如在窗口中布局文本、按钮和其他控件,然后调用 EndPaint。 

         对于此应用程序,开始调用和结束调用之间的逻辑是在窗口中显示字符串 “Hello,World!”。 在以下代码中,TextOut 函数用于显示字符串。

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { 
    	PAINTSTRUCT ps;
    	HDC hdc; 
    	TCHAR greeting[] = _T("Hello, World!"); 
    	switch (message) { 
    		case WM_PAINT: 
    			//要处理 WM_PAINT 消息,首先应调用 BeginPaint
    			//然后处理所有的逻辑以及在窗口中布局文本、按钮和其他控件等
    			//然后调用 EndPaint。 
    			hdc = BeginPaint(hWnd, &ps); 
    
    			// -----------------在这段代码对应用程序进行布局------------------------ 
    			// 对于此应用程序,开始调用和结束调用之间的逻辑是在窗口中显示字符串 “Hello,World!”。
    			// 请注意 TextOut 函数用于显示字符串。
    			TextOut(hdc, 50, 5, greeting, _tcslen(greeting)); 
    			// -----------------------布局模块结束----------------------------------
    
    			EndPaint(hWnd, &ps);
    			break; 
    		case WM_DESTROY: 
    			PostQuitMessage(0); 
    			break;
    		default: 
    			//DefWindowProc缺省窗口处理函数
    			//这个函数是默认的窗口处理函数,我们可以把不关心的消息都丢给它来处理
    			return DefWindowProc(hWnd, message, wParam, lParam); 
    			break; 
    	} 
    	return 0; 
    } 

         程序运行的结果为:


         完整代码

         到此我已经理清了写一个Windows应用程序的主要逻辑

         我是按照Microsoft官方文档进行的学习,详见创建Windows桌面应用程序

         对于更多的细节,代码中给出了详细注释。

    // GT_HelloWorldWin32.cpp 
    // compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c 
    // 这是一个最简单的Win32程序,亦可作为开发桌面应用程序的模板
    
    #include <windows.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include <tchar.h> 
    
    // ------------------------Global variables---------------------------------
    // 主窗体类名
    static TCHAR szWindowClass[] = _T("win32app"); 
    // 应用程序标题栏处出现的字符串
    static TCHAR szTitle[] = _T("Win32 Guided Tour Application"); 
    
    //HINSTANCE 是Windows里的一中数据类型,是用于标示(记录)一个程序的实例。
    //它与HMODULE是一样的(通用的,这两种类型最终就是32位无符号长整形)。
    //HINSTANCE,分开看就是 HANDLE(句柄) + INSTANCE(实例)
    //实例就是一个程序。用qq来举例:你可以开同时开2个qq号,但是你电脑里的qq软件只有一份。
    //这2个qq号就是qq的2个实例
    HINSTANCE hInst; 
    
    // -------------------------需要预定义的函数放置在此代码块种:---------------------------- 
    
    
    //每个 Windows 桌面应用程序必须具有一个窗口过程函数
    //此函数处理应用程序从操作系统中接收的大量消息。 
    //例如,如果应用程序的对话框中有“确定”按钮,那么用户单击该按钮时,
    //操作系统会向应用程序发送一条消息,通知按钮已被单击。WndProc 负责对该事件作出响应。
    //在本例中,相应的响应可能是关闭对话框。
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 
    
    //-------------------------------------正式内容-----------------------------------------
    
    //主窗体函数(入口过程)
    //每个基于 Win32 的应用程序的函数必须具有 WinMain 函数
    //正如每个 C 应用程序和 C++ 控制台应用程序在起始点必须具有 main 函数
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { 
    	//创建 WNDCLASSEX 类型的窗口类结构。 此结构包含关于窗口的信息
    	//例如应用程序图标、窗口背景色、标题栏中显示的名称、窗口过程函数的名称等。
    	WNDCLASSEX wcex; 
    	wcex.cbSize = sizeof(WNDCLASSEX); 
    	wcex.style          = CS_HREDRAW | CS_VREDRAW; 
    	wcex.lpfnWndProc    = WndProc; 
    	wcex.cbClsExtra     = 0; 
    	wcex.cbWndExtra     = 0; 
    	wcex.hInstance      = hInstance; 
    	wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); 
    	wcex.hCursor        = LoadCursor(NULL, IDC_ARROW); 
    	wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1); 
    	wcex.lpszMenuName   = NULL; 
    	wcex.lpszClassName  = szWindowClass; 
    	wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); 
    	
    	//对已创建的窗口类进行注册。 使用 RegisterClassEx 函数,并将窗口类结构作为参数传递。
    	if (!RegisterClassEx(&wcex)) { 
    		MessageBox(NULL, _T("Call to RegisterClassEx failed!"), _T("Win32 Guided Tour"), NULL); 
    		return 1; 
    	} 
    
    	// Store instance handle in our global variable 
    	// 将句柄实例存储于全局变量中
    	hInst = hInstance; 
    	
    	// CreateWindow 函数的参数解释: 
    	// szWindowClass: the name of the application 
    	// szTitle: the text that appears in the title bar 
    	// WS_OVERLAPPEDWINDOW: the type of window to create 
    	// CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y) 
    	// 500, 100: initial size (width, length) 
    	// NULL: the parent of this window 
    	// NULL: this application does not have a menu bar 
    	// hInstance: the first parameter from WinMain 
    	// NULL: not used in this application 
    	// 返回的HWND是一个窗口的句柄
    	HWND hWnd = CreateWindow( szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL ); 
    	if (!hWnd) { 
    		MessageBox(NULL, _T("Call to CreateWindow failed!"), _T("Win32 Guided Tour"), NULL); 
    		return 1; 
    	} 
    
    
    	// ShowWindow 函数的参数解释: 
    	// hWnd: CreateWindow函数返回的窗口句柄 
    	// nCmdShow: the fourth parameter from WinMain 
    	ShowWindow(hWnd, nCmdShow);
    	// UpdateWindow函数用于更新窗口指定的区域
    	// 如果窗口更新的区域不为空,UpdateWindow函数就发送一个WM_PAINT消息来更新指定窗口的客户区。
    	// 函数绕过应用程序的消息队列,直接发送WM_PAINT消息给指定窗口的窗口过程
    	// 如果更新区域为空,则不发送消息。
    	UpdateWindow(hWnd); 
    
    	// Main message loop: 
    	// 添加用于侦听操作系统所发送消息的消息循环。 
    	// 当应用程序收到一条消息时,此循环将该消息调度到 WndProc 函数以进行处理。 
    	MSG msg; 
    	while (GetMessage(&msg, NULL, 0, 0)) { 
    		TranslateMessage(&msg); //翻译消息
    		DispatchMessage(&msg);  //派遣消息
    	} 
    	return (int) msg.wParam; 
    } 
    
    // //  函数: WndProc(HWND, UINT, WPARAM, LPARAM) 
    // //  目标:  处理主窗体产生的信息
    // //  WM_PAINT消息代表绘制主窗体 
    // //  WM_DESTROY消息代表投递一个退出消息并返回 
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { 
    	PAINTSTRUCT ps;
    	HDC hdc; 
    	TCHAR greeting[] = _T("Hello, World!"); 
    	switch (message) { 
    		case WM_PAINT: 
    			//要处理 WM_PAINT 消息,首先应调用 BeginPaint
    			//然后处理所有的逻辑以及在窗口中布局文本、按钮和其他控件等
    			//然后调用 EndPaint。 
    			hdc = BeginPaint(hWnd, &ps); 
    
    			// -----------------在这段代码对应用程序进行布局------------------------ 
    			// 对于此应用程序,开始调用和结束调用之间的逻辑是在窗口中显示字符串 “Hello,World!”。
    			// 请注意 TextOut 函数用于显示字符串。
    			TextOut(hdc, 50, 5, greeting, _tcslen(greeting)); 
    			// -----------------------布局模块结束----------------------------------
    
    			EndPaint(hWnd, &ps);
    			break; 
    		case WM_DESTROY: 
    			PostQuitMessage(0); 
    			break;
    		default: 
    			//DefWindowProc缺省窗口处理函数
    			//这个函数是默认的窗口处理函数,我们可以把不关心的消息都丢给它来处理
    			return DefWindowProc(hWnd, message, wParam, lParam); 
    			break; 
    	} 
    	return 0; 
    } 



    展开全文
  • 本篇博客主要是针对用c++一个简单项目的框架 涉及到函数,结构体,数据的保存,对运行界面清屏暂停操作的处理。 确定要定义的函数用到的头文件: 确定好项目的菜单框架 关于保存函数,用于保存输入的数据,自动...
  • c++入门练习--菜单

    2017-12-22 15:38:47
    main.cpp#include <iostream>void Menu(); //声明主菜单 int Out(); //声明小目录int main(){ Menu(); //主菜单 return 0; }//定义菜单 void Menu(){ bool opt = true; //是否循环的一个标志 while (opt == tr
  • 终于开始准备写自己的第一篇博客了,想想现在大二结束了,也要开始准备整理这么...我自己的基本框架是.net,新建一个CLR项目,添加一个窗体。首先说一下要实现的基本功能,最基本的肯定是读写.txt文件,其次是复制、粘
  • 开发一个小型绘图应用程序,具体要求如下: (1)具有标准Windows应用程序的界面和风格(视图要求滚动); (2)通过选择菜单或工具栏中相应功能完成基本几何图形的绘制(基本几何图形包括直线、圆、椭圆、矩形等); (3)...
  • 在界面中占据了重要位置,它的效果如何,直接影响了整个程序的界面效果,正因为这个原因,当今流行的应用程序菜单都支持附带图标、反映当前状态的功能,也就是说,菜单项上不再仅仅有文字,还有附带一个小小的图标...
  • c++实现计算器功能

    2018-01-16 20:55:03
    一个作业,需要用C++程序模拟苹果手机的计算器功能,包括加减乘除以及删除(C)和存储(A)
  • C++实现简单计算器”。
  • 作者:JustForFun ...来源:知乎 ...“怎么从我们这样一开始学C++到能做一个像平时玩的一个简单的游戏”“从我们这样一开始学C++”  这是你的现在状态,那么我假定:你还没有C++入门咯,或者C++刚完成“理
  • 多级菜单 简单实现

    2017-12-18 17:53:55
    多级菜单简单的思路就是多级循环,在while里面嵌套while循环,但是在写的过程中就会发现很多代码都是重复写,而且如果遇到100级的菜单就要写100级的循环,很不方便。 如何将代码尽量简化并且可以适用于N级菜单呢,...
  • ☆主要用到的函数: //这函数是确认输出的具体位置,通过COORD结构体)...//这函数主要更改文字的前景色与背景色第二参数0`15表示文字15种前景色 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), ...
  • 还不想使用vs2019的用户可以看博主的vs2017这篇博客:vs2017安装和使用教程(详细)里面涵盖了大...这是针对于以上安装教程的C++项目新建示例,与vs2017稍有不同,旨在示范从项目搭建到程序运行的简单流程,代码就...
  • Dev-C++一个可视化集成开发环境,可以此软件实现C/C++程序的编辑、预处理/编译/链接、运行和调试。本手册中介绍了Dev-C++常用的一些基本操作,每一位同学都要掌握。 一.启动Dev-C++ 方法一: 1. 鼠标点击任务...
1 2 3 4 5 ... 20
收藏数 59,030
精华内容 23,612
关键字:

用c++实现一个简单的菜单程序