简体   繁体   English

我可以使用现有项目代码在c ++中创建一个窗口吗

[英]can I create a window in c++ using existing project code

I was wondering if i could create a window using my existing project code. 我想知道是否可以使用现有的项目代码创建一个窗口。 This is a school project. 这是一个学校项目。 However, I have completed the actual coding part and just wanted to make the project fancier, so to say. 但是,可以这么说,我已经完成了实际的编码部分,只是想使项目更高级。 Thank you so much in advance for all the support. 预先非常感谢您提供的所有支持。

Here is the actual code in case it would be of any help. 这是实际的代码,以防万一。 It's a bit lengthy so be warned :) Once again, thank you in advance 这有点冗长,因此请注意:)再次感谢您提前

#define NOMINMAX
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <windows.h>
#include <Windows.h>
#include <chrono>
#include <string>
#include <fstream>
#include <iomanip>
#include <cstdlib>


using namespace std;


int key[3][3];
double inverted[3][3];
int store[1][3] = { 0 };
int conv[666];


int random1()
{
    unsigned long long int xRan;
    srand(time(NULL));

    xRan = rand() % 9999 + 1;

    return xRan;
}
int random2()
{
    unsigned long long int xRan;

    xRan = rand() % 9999 + 1;  

    return xRan;
}
int  random3()
{
    int xRan;

    xRan = rand() % 9999 + 1;

    return xRan;
}
void clear_screen(char fill = ' ') {
    COORD tl = { 0, 0 };
    CONSOLE_SCREEN_BUFFER_INFO s;
    HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(console, &s);
    DWORD written, cells = s.dwSize.X * s.dwSize.Y;
    FillConsoleOutputCharacter(console, fill, cells, tl, &written);
    FillConsoleOutputAttribute(console, s.wAttributes, cells, tl, &written);
    SetConsoleCursorPosition(console, tl);
}
int convert(char letter) {
    int conv;
    conv = (int)letter;

    return conv;
}
void reverseMult(double inv[3][3], int decode[1][3])
{
    store[0][0] = decode[0][0] * inv[0][0] + decode[0][1] * inv[1][0] + decode[0][2] * inv[2][0] + 0.5;
    store[0][1] = decode[0][0] * inv[0][1] + decode[0][1] * inv[1][1] + decode[0][2] * inv[2][1] + 0.5;
    store[0][2] = decode[0][0] * inv[0][2] + decode[0][1] * inv[1][2] + decode[0][2] * inv[2][2] + 0.5;
}
void matrixMult(int q, int w, int e, int a[3][3])
{

    int A[1][3] = { q, w, e };
    int B[3][3] = {
        { a[0][0], a[0][1], a[0][2] },
        { a[1][0], a[1][1], a[1][2] },
        { a[2][0], a[2][1], a[2][2] }
    };


    store[0][0] = A[0][0] * B[0][0] + A[0][1] * B[1][0] + A[0][2] * B[2][0];
    store[0][1] = A[0][0] * B[0][1] + A[0][1] * B[1][1] + A[0][2] * B[2][1];
    store[0][2] = A[0][0] * B[0][2] + A[0][1] * B[1][2] + A[0][2] * B[2][2];

        //cout << store[0][0] << endl << store[0][1] << endl << store[0][2] << endl << endl;


}
char reverseConv(int x){

    char conv;
    conv = (char)x;

    return conv;
}
void inverse(int key[3][3], double det){

        int cofactor[3][3] = {
            { (key[1][1] * key[2][2] - key[1][2] * key[2][1]), -(key[1][0] * key[2][2] - key[1][2] * key[2][0]), (key[1][0] * key[2][1] - key[1][1] * key[2][0]) },
            { -(key[0][1] * key[2][2] - key[0][2] * key[2][1]), (key[0][0] * key[2][2] - key[0][2] * key[2][0]), -(key[0][0] * key[2][1] - key[0][1] * key[2][0]) },
            { (key[0][1] * key[1][2] - key[0][2] * key[1][1]), -(key[0][0] * key[1][2] - key[0][2] * key[1][0]), (key[0][0] * key[1][1] - key[0][1] * key[1][0]) }
        };

        for (int i = 0; i < 3; ++i)
        {
            for (int j = 0; j < 3; ++j)
            {
                inverted[i][j] =det * cofactor[i][j];
            }
        }
    } 

int main()
{
    while (1){
    cout << "Would you like to encrypt or decrypt?(e/d)\n " << endl;
    string ende;
    cin >> ende;

    clear_screen();

    if (ende == "e")
    {

        cout << "Please enter a name for the message: " << endl << endl;
        string file;
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        getline(cin, file);

        clear_screen();

        file += ".txt";
        ofstream encrypt;
        encrypt.open(file);


        string message;
        cout << "Please enter the message you would like to encrypt: " << endl << endl;
        //cin.ignore(numeric_limits<streamsize>::max(), '\n'); --- Not needed anymore, uncomment if you cannot input message
        getline(cin, message);
        if (message.length() % 3 != 0)
            message += ' ';
        if (message.length() % 3 != 0)
            message += ' ';

        clear_screen();

        for (int i = 0; i < message.length(); ++i)
        {
            conv[i] = convert(message[i]);

        }


        int det = 0;

        while (1){
            key[0][0] = random1();              //1
            key[0][1] = random2();              //2
            key[0][2] = random3();              //3
            key[1][0] = random1() * 13 / 7;     //4
            key[1][1] = random2() * 23 / 7;     //5
            key[1][2] = random3() * 33 / 7;     //6
            key[2][0] = random1() * 18 / 15;    //7
            key[2][1] = random2() * 18 / 12;    //8
            key[2][2] = random3() * 18 / 10;    //9


            det = key[0][0] * key[1][1] * key[2][2] + key[0][1] * key[1][2] * key[2][0] + key[0][2] * key[1][0] * key[2][1]
                - key[0][2] * key[1][1] * key[2][0] - key[0][0] * key[1][2] * key[2][1] - key[0][1] * key[1][0] * key[2][2];

            if (det != 0)
                break;
        }

        encrypt << key[0][0] << ' ' << key[0][1] << ' ' << key[0][2] << ' '
            << key[1][0] << ' ' << key[1][1] << ' ' << key[1][2] << ' '
            << key[2][0] << ' ' << key[2][1] << ' ' << key[2][2] << endl << endl;

        int a, b, c;
        int count = 0;

        for (int i = 0; i < (message.length)() / 3; ++i)
        {
            int counting = 0;
            a = conv[count];
            count++;
            b = conv[count];
            count++;
            c = conv[count];
            count++;


            matrixMult(a, b, c, key);


            encrypt << store[0][counting] << ' ';
            counting++;
            encrypt << store[0][counting] << ' ';
            counting++;
            encrypt << store[0][counting] << endl;

        }




        encrypt.close();

        Sleep(750);
        cout << "Your message has been encrypted." << endl;
        Sleep(750);
        cout << "Please check " << file << " for the encrypted message and key" << endl << endl;
        Sleep(750);
    }


    if (ende == "d")
    {


        cout << "Please enter the name of the file you would like to decrypt: " << endl << endl;

        string file;
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        getline(cin, file);

        clear_screen();

        file += ".txt";
        ifstream decrypt;
        decrypt.open(file);

        int key[3][3];

        for (int i = 0; i < 3; ++i)
        {
            for (int k = 0; k < 3; ++k){
                decrypt >> key[k][i];
            }
        }

        int det = 0;
        det = key[0][0] * key[1][1] * key[2][2] + key[0][1] * key[1][2] * key[2][0] + key[0][2] * key[1][0] * key[2][1] - key[0][2] * key[1][1] * key[2][0] - key[0][0] * key[1][2] * key[2][1] - key[0][1] * key[1][0] * key[2][2];

        double detInv = 1;
        detInv /= det;

        //double inv;

        inverse(key, detInv);

        int out[1][3];
        int count = 0;
        while (!decrypt.eof()){
            for (int i = 0; i < 3; ++i)
            {
                decrypt >> out[0][i];
            }

            reverseMult(inverted, out);

            count++;

            char a, b, c;

            a = reverseConv(store[0][0]);
            b = reverseConv(store[0][1]);
            c = reverseConv(store[0][2]);

            if (decrypt.eof())
                break;

            cout << a << b << c;

        }
    }
        cout << endl << endl;
        cout << "Would you like to continue?(y/n) ";
        char again;
        cin >> again;

        if (again != 'y')
            exit(0);
        clear_screen();
}
        return 0;
} 

Yes, you can convert your project to a Windowing application. 是的,您可以将项目转换为Windowing应用程序。 You have two choices: 您有两种选择:

  • Use Windows (native) API 使用Windows (原生) API
  • Use graphics framework 使用图形框架

Windows API Windows API

The Windows API is the direct method for creating windows. Windows API是创建窗口的直接方法。 However, it is a lot of code, lots of chances for defects to be injected. 但是,这是很多代码,有很多机会注入缺陷。 It is a good learning experience about how the Windowing system works. 这是有关Windowing系统如何工作的良好学习经验。 Get Petzold's book. 获取Petzold的书。

GUI Framework GUI框架

There are a lot of GUI frameworks out there. 那里有很多GUI 框架 These C++ frameworks have simplified the GUI and Widget creation, using object oriented programming. 这些C ++框架使用面向对象的编程简化了GUI和Widget的创建。 There are many out there, so search the internet for "GUI Framework C++ review". 那里有很多,因此请在Internet上搜索“ GUI Framework C ++评论”。

A Different Programming Perspective 不同的编程视角

In your present project, the OS executes the program and statements are executed in order. 在您当前的项目中,操作系统将执行程序,并且语句将按顺序执行。 A windowing system is based on event driven programming. 窗口系统基于事件驱动的编程。 In summary, your GUI is waiting for an event to occur. 总而言之,您的GUI正在等待事件发生。

A simple example for your project is a window with a single button. 您的项目的一个简单示例是带有单个按钮的窗口。 When the User clicks on the button, the Windowing system sends a message to the button event handler . 当用户单击按钮时,窗口系统将消息发送到按钮事件处理程序 The event handler is a function that will execute your code. 事件处理程序是一个将执行您的代码的函数。

As Thomas said, yes you can migrate your code to a Windows application, by either going native with Win32 or by either using a C++ GUI Framework (QT, wxWindows, ...). 正如Thomas所说的,可以将代码迁移到Windows应用程序,方法是使用Win32本机或使用C ++ GUI框架(QT,wxWindows等)。

However, you will need to invest time to learn one of the solution. 但是,您将需要花费时间来学习一种解决方案。 I would suggest to learn a C++ Framework, programming with low-level Win32 api is not very used today. 我建议学习一个C ++框架,现在很少使用低级Win32 api进行编程。

Although it's off-topic, I would suggest some improvements to your code. 尽管这是题外话,但我还是建议您对代码进行一些改进。

First, you shouldn't use goto, and replace them by a while. 首先,您不应该使用goto并暂时替换它们。 You can replace 您可以更换

again:
    xRan = rand() % 9999 + 1;
    if (xRan <1)
        goto again;

By 通过

do{
   xRan = rand() % 9999 + 1;
} while (xRan < 1);

Note that in this case, a goto or a while is useless as xRan will always be superior or equal to 1 (rand() always returns a positive value) 请注意,在这种情况下,goto或一阵子是无用的,因为xRan将始终大于或等于1(rand()始终返回正值)

Also you can replace convert and reverseConv very long functions by a constant array of struct values (struct contains a int and a const char*). 您也可以用恒定的结构值数组(construct包含int和const char *)来替换convert和reverseConv较长的函数。 convert and reverseConvert functions would only parse the array to find a proper match. convert和reverseConvert函数只会解析该数组以找到适当的匹配项。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用现有C ++源代码在Eclipse CDT中创建GNU Autotool项目? - How do i create a GNU Autotool Project in Eclipse CDT from existing C++ source code? 我可以在 c++ builder 版本 26.0.36039.7899 上打开现有项目吗? - Can I open a existing project on c++ builder version 26.0.36039.7899? 我可以在 MAC 上打开现有的 Visual Studio 项目 (C++) 吗? - Can I open an existing Visual Studio Project (C++) on MAC? 如何创建一个使用CLR混合C和C ++的Visual Studio项目? - How can I create a single Visual Studio project that mixes C and C++ using CLR? 如何在C ++循环中创建和附加形状? - How Can I create and attach shapes to a window in a loop in C++? 如何在OSX上创建一个窗口以用于C ++? - How can I create a window on OSX for use in C++? 如何使用c ++和opengl在Mac中创建窗口? - How do I create a window in mac using c++ and opengl? 如何使用可执行文件将C ++代码合并到Xcode项目中? - How can I incorporate my C++ code into my Xcode project using an Executable file? 如何在Haxe Project中使用简单的c ++代码? - How can I use simple c++ code in Haxe Project? 如何使用C ++将窗口带到Vista的前台? - How can I bring a window to the foreground in Vista using C++?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM