Advertisement
ElfikCo

SO Lab 4 v3

Nov 29th, 2019
486
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.72 KB | None | 0 0
  1.  
  2. // SO4LABDlg.cpp : implementation file
  3. //
  4.  
  5. #include "pch.h"
  6. #include "framework.h"
  7. #include "SO4LAB.h"
  8. #include "SO4LABDlg.h"
  9. #include "afxdialogex.h"
  10.  
  11.  
  12. #ifdef _DEBUG
  13. #define new DEBUG_NEW
  14. #endif
  15.  
  16. HANDLE h_skrzynka;
  17. static UINT NEAR WM_LAB4 = RegisterWindowMessage("WM_SYSTOPER_LAB4");
  18.  
  19. // CAboutDlg dialog used for App About
  20.  
  21. class CAboutDlg : public CDialogEx
  22. {
  23. public:
  24.     CAboutDlg();
  25.  
  26. // Dialog Data
  27. #ifdef AFX_DESIGN_TIME
  28.     enum { IDD = IDD_ABOUTBOX };
  29. #endif
  30.  
  31.     protected:
  32.     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  33.  
  34. // Implementation
  35. protected:
  36.     DECLARE_MESSAGE_MAP()
  37. public:
  38. //  afx_msg void OnTimer(UINT nIDEvent);
  39. //  void OnBnClickedOdswierz();
  40. //  afx_msg void OnBnClickedWyslij();
  41. //  afx_msg void OnBnClickedZaliczamy();
  42. //  afx_msg void OnBnClickedKoniec();
  43. };
  44.  
  45. CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
  46. {
  47. }
  48.  
  49. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  50. {
  51.     CDialogEx::DoDataExchange(pDX);
  52. }
  53.  
  54. BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
  55. END_MESSAGE_MAP()
  56.  
  57.  
  58. // CSO4LABDlg dialog
  59.  
  60.  
  61.  
  62. CSO4LABDlg::CSO4LABDlg(CWnd* pParent /*=nullptr*/)
  63.     : CDialogEx(IDD_SO4LAB_DIALOG, pParent)
  64. {
  65.     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  66. }
  67.  
  68. void CSO4LABDlg::DoDataExchange(CDataExchange* pDX)
  69. {
  70.     CDialogEx::DoDataExchange(pDX);
  71.     DDX_Control(pDX, IDC_EDIT1, m_ekran);
  72.     DDX_Control(pDX, IDC_BUTTON1, m_odswiez);
  73.     DDX_Control(pDX, IDC_BUTTON2, m_koniec);
  74.     DDX_Control(pDX, IDC_BUTTON3, m_zaliczamy);
  75.     DDX_Control(pDX, IDC_BUTTON4, m_wyslij);
  76.     DDX_Control(pDX, IDC_COMBO1, m_lista);
  77. }
  78.  
  79. BEGIN_MESSAGE_MAP(CSO4LABDlg, CDialogEx)
  80.     ON_WM_SYSCOMMAND()
  81.     ON_WM_PAINT()
  82.     ON_WM_QUERYDRAGICON()
  83.     ON_WM_TIMER()
  84.     ON_REGISTERED_MESSAGE(WM_LAB4, OnWiadomosc)
  85.     ON_BN_CLICKED(IDC_BUTTON1, &CSO4LABDlg::OnBnClickedOdswiez)
  86.     ON_BN_CLICKED(IDC_BUTTON4, &CSO4LABDlg::OnBnClickedWyslij)
  87.     ON_BN_CLICKED(IDC_BUTTON3, &CSO4LABDlg::OnBnClickedZaliczamy)
  88.     ON_BN_CLICKED(IDC_BUTTON2, &CSO4LABDlg::OnBnClickedKoniec)
  89. END_MESSAGE_MAP()
  90.  
  91.  
  92. // CSO4LABDlg message handlers
  93.  
  94. BOOL CSO4LABDlg::OnInitDialog()
  95. {
  96.     CDialogEx::OnInitDialog();
  97.  
  98.     // Add "About..." menu item to system menu.
  99.  
  100.     // IDM_ABOUTBOX must be in the system command range.
  101.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  102.     ASSERT(IDM_ABOUTBOX < 0xF000);
  103.  
  104.     CMenu* pSysMenu = GetSystemMenu(FALSE);
  105.     if (pSysMenu != nullptr)
  106.     {
  107.         BOOL bNameValid;
  108.         CString strAboutMenu;
  109.         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  110.         ASSERT(bNameValid);
  111.         if (!strAboutMenu.IsEmpty())
  112.         {
  113.             pSysMenu->AppendMenu(MF_SEPARATOR);
  114.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  115.         }
  116.     }
  117.  
  118.     // Set the icon for this dialog.  The framework does this automatically
  119.     //  when the application's main window is not a dialog
  120.     SetIcon(m_hIcon, TRUE);         // Set big icon
  121.     SetIcon(m_hIcon, FALSE);        // Set small icon
  122.  
  123.     // TODO: Add extra initialization here
  124.     srand((unsigned)time(0));
  125.     SetTimer(1,500,0);
  126.    
  127.     //Nazewnictwo skrzynki
  128.     CString w, nazwaSkrzynki;
  129.     DWORD odpowiedzRozmiar;
  130.     CallNamedPipeA("\\\\.\\pipe\\sysopnp", "GET", 4, w.GetBufferSetLength(8192), 8192, &odpowiedzRozmiar, 3000);
  131.     nazwaSkrzynki.AppendFormat("\\\\.\\mailslot\\skrzynka%c", w[0]);
  132.  
  133.     //Zmiana nazwy okna
  134.     CString nazwaOkna;
  135.     AfxGetMainWnd()->GetWindowTextA(nazwaOkna);
  136.     nazwaOkna.AppendFormat("Skrzynka %c", w[0]);
  137.     AfxGetMainWnd()->SetWindowTextA(nazwaOkna);
  138.  
  139.     //Tworzenie skrzynki
  140.     h_skrzynka = CreateMailslot(nazwaSkrzynki, 1024, 0, NULL);
  141.  
  142.     if (h_skrzynka == NULL)
  143.         MessageBox("Nieudana próba utworzenia skrzynki!");
  144.     else {
  145.         DWORD d;
  146.         CString w1 = "PUT ";
  147.         w1.Append(nazwaSkrzynki);
  148.         char* w2 = new char[1024];
  149.         memset(w2, 0, 1024);
  150.  
  151.         if (!CallNamedPipeA("\\\\.\\pipe\\sysopnp", w1.GetBuffer() , w1.GetLength() + 1, w2, 1024, &d, 3000)) {
  152.             MessageBox("Blad w transakcji");
  153.         }
  154.         delete[] w2;
  155.     }
  156.  
  157.     return TRUE;  // return TRUE  unless you set the focus to a control
  158. }
  159.  
  160. void CSO4LABDlg::OnSysCommand(UINT nID, LPARAM lParam)
  161. {
  162.     if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  163.     {
  164.         CAboutDlg dlgAbout;
  165.         dlgAbout.DoModal();
  166.     }
  167.     else
  168.     {
  169.         CDialogEx::OnSysCommand(nID, lParam);
  170.     }
  171. }
  172.  
  173. // If you add a minimize button to your dialog, you will need the code below
  174. //  to draw the icon.  For MFC applications using the document/view model,
  175. //  this is automatically done for you by the framework.
  176.  
  177. void CSO4LABDlg::OnPaint()
  178. {
  179.     if (IsIconic())
  180.     {
  181.         CPaintDC dc(this); // device context for painting
  182.  
  183.         SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  184.  
  185.         // Center icon in client rectangle
  186.         int cxIcon = GetSystemMetrics(SM_CXICON);
  187.         int cyIcon = GetSystemMetrics(SM_CYICON);
  188.         CRect rect;
  189.         GetClientRect(&rect);
  190.         int x = (rect.Width() - cxIcon + 1) / 2;
  191.         int y = (rect.Height() - cyIcon + 1) / 2;
  192.  
  193.         // Draw the icon
  194.         dc.DrawIcon(x, y, m_hIcon);
  195.     }
  196.     else
  197.     {
  198.         CDialogEx::OnPaint();
  199.     }
  200. }
  201.  
  202. // The system calls this function to obtain the cursor to display while the user drags
  203. //  the minimized window.
  204. HCURSOR CSO4LABDlg::OnQueryDragIcon()
  205. {
  206.     return static_cast<HCURSOR>(m_hIcon);
  207. }
  208.  
  209. void CSO4LABDlg::OnTimer(UINT nIDEvent)
  210. {
  211.     DWORD lWiad = 0;
  212.     GetMailslotInfo(h_skrzynka, NULL, NULL, &lWiad, NULL);
  213.     if (lWiad > 0) {
  214.         CString wiadomosc;
  215.         CFile file(h_skrzynka);
  216.         char wiesc[1024];
  217.  
  218.         file.Read(wiesc, 1024);
  219.         m_ekran.GetWindowTextA(wiadomosc);
  220.         wiadomosc.AppendFormat("%s\r\n", wiesc);
  221.         m_ekran.SetWindowTextA(wiadomosc);
  222.     }
  223.     CDialog::OnTimer(nIDEvent);
  224. }
  225.  
  226. void CSO4LABDlg::OnBnClickedOdswiez()
  227. {
  228.     CString w;
  229.     DWORD odpowiedzRozmiar;
  230.     if (CallNamedPipeA("\\\\.\\pipe\\sysopnp", "GET", 4, w.GetBufferSetLength(8192), 8192, &odpowiedzRozmiar, 3000)) {
  231.         m_lista.ResetContent();
  232.         CString temp;
  233.         bool first = false;
  234.         for (unsigned int i = 0; i < odpowiedzRozmiar; i++) {
  235.             if (w[i] == '\n' || !first) {
  236.                 if (!first && w[i] == '\n') first = true;
  237.                 else if(temp.GetLength() != 0){
  238.                     m_lista.AddString(temp);
  239.                     temp.Empty();
  240.                 }
  241.             }
  242.             else
  243.                 temp.AppendChar(w[i]);
  244.         }
  245.  
  246.     }
  247. }
  248.  
  249. void CSO4LABDlg::OnBnClickedWyslij()
  250. {
  251.     CString bufor;
  252.     m_lista.GetWindowTextA(bufor);
  253.  
  254.     CFile skrzynka(bufor, CFile::modeWrite + CFile::shareDenyNone);
  255.     CString wiadomosc = "KrolArtur@C64: EXCALIBUR!";
  256.     skrzynka.Write(wiadomosc, wiadomosc.GetLength() + 1);
  257.     skrzynka.Close();
  258.  
  259. }
  260.  
  261. afx_msg LRESULT CSO4LABDlg::OnWiadomosc(WPARAM n, LPARAM m)
  262. {
  263.     //TODO: Odbior przeslanego kodu
  264.     CString tekst;
  265.     tekst.AppendFormat("WPARAM: %X LPARAM: %X", n, m);
  266.     MessageBox(tekst, "Info", MB_OK);
  267.     return 0;
  268. }
  269.  
  270.  
  271. void CSO4LABDlg::OnBnClickedZaliczamy()
  272. {
  273.     CEvent zdarzenie(0, 0, "Koniec ćwiczenia", NULL);
  274.     zdarzenie.SetEvent();
  275. }
  276.  
  277. void CSO4LABDlg::OnDestroy() {
  278.     KillTimer(1);
  279.     CDialog:OnDestroy();
  280. }
  281.  
  282. void CSO4LABDlg::OnBnClickedKoniec()
  283. {
  284.     EndDialog(1);
  285. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement