سؤال

أنا في محاولة لجعل Visual C++ 2008 برنامج قطع بعض البيانات في النافذة.لقد قرأت من مختلف الأماكن الطريقة الصحيحة للقيام بذلك هو تجاوز WndProc.لذلك أنا جعلت تطبيق نماذج Windows في Visual C++ 2008 Express Edition و أضفت هذه التعليمات البرمجية Form1.ح ، ولكن ذلك لن ترجمة:

    public:
    [System::Security::Permissions::PermissionSet(System::Security::Permissions::SecurityAction::Demand, Name="FullTrust")]
    virtual void WndProc(Message %m) override
    {
        switch(m.Msg)
        {
            case WM_PAINT:
            {
                HDC     hDC;
                PAINTSTRUCT ps;
                hDC = BeginPaint(m.HWnd, &ps);

                // i'd like to insert GDI code here

                EndPaint(m.Wnd, &ps);
                return;
            }
        }
        Form::WndProc(m);
    }

عند محاولة ترجمة هذا في Visual C++ 2008 Express Edition, يحدث هذا الخطأ:خطأ C2664:'BeginPaint' :لا يمكن تحويل المعلمة 1 من النظام::IntPtr' إلى 'HWND'

عندما أحاول استخدام هذا->مقبض بدلا من م.HWnd نفس الخطأ.

عندما كنت في محاولة صب م.HWnd إلى (HWND), يحدث هذا الخطأ:خطأ C2440:'نوع الزهر' :لا يمكن التحويل من النظام::IntPtr' إلى 'HWND'

ربما أحتاج أن يلقي م.HWnd إلى pin_ptr أو شيء من هذا.

هل كانت مفيدة؟

المحلول

إذا كنت صنع الخام Win32 التطبيق ثم يمكنك استخدام هذه الوظائف.

إذا من ناحية أخرى كنت ترغب بجعل WinForms التطبيق ثم تحتاج إلى تجاوز OnPaint الحدث.

  • التبديل إلى طريقة العرض "تصميم" (يرى أن يظهر النموذج الخاص بك.)
  • انقر فوق شريط عنوان النموذج الخاص بك
  • في الإطار "خصائص" (افتراضيا على الأرجح على أسفل يمين الشاشة) حدد صاعقة بالقرب من أعلى.هذا عرض قائمة من الأحداث.
  • انتقل لأسفل إلى الطلاء الحدث انقر نقرا مزدوجا فوق ذلك.

سوف ينتهي بك الأمر مع الطلاء الروتينية شل التي يمكنك من خلالها استخدام الرسم وظائف كائن الرسومات.


private: System::Void Form1_Paint(System::Object^  sender, System::Windows::Forms::PaintEventArgs^  e) 
{
    e->Graphics->DrawRectangle(...)              
}

إذا كنت حقا تريد أن تكتب الخام Win32 رمز, اسمحوا لي أن أعرف وأنا يمكن أن تساعدك على كتابة قذيفة.في الوقت الحاضر إذا كنت مهتما في Win32 أوصي تشارلز بيتزولد برمجة ويندوز 5th edition.

إذا كنت ترغب في تعلم C++ WinForms...حسنا, أنا أنصح التحول إلى C# أو VB.NET ببساطة لأنها قد تكون أكثر سهولة.

ويساعد هذا الأمل.الهتافات.

نصائح أخرى

المقالات يمكنك الرجوع لمناقشة كيفية القيام بذلك في مواطن C++ التطبيق وليس في WinForms التطبيق.يجب عليك تجاوز OnPaint الأسلوب بدلا من التعامل مع الرسالة في WndProc.

أعتقد أنك تحصل على الخلط بين Win32 البرمجة (يجب تجاوز WM_PAINT) و Windows Forms / .صافي حيث لديك فقط إلى تجاوز طريقة التعادل.

الرسم على شكل فائقة بسيطة .صافي!يمكنك ببساطة تجاوز OnPaint الأسلوب ومن ثم أداء كل من الرسم الخاص بك.

يمكنك ربط إلى الطلاء معالج إما باستخدام أدوات في Visual Studio أو باستخدام التعليمات البرمجية التالية في فئة ؛

this.Paint += new System.Windows.Forms.PaintEventHandler(this.MyForm_Paint); 

ثم تنفيذ MyForm_Paint طريقة مثل ذلك ؛

private void MyForm_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
  //create a graphics object from the form
  Graphics g = this.CreateGraphics();

  // create  a  pen object with which to draw
  Pen p = new Pen(Color.Red, 7);  // draw the line 

  // call a member of the graphics class
  g.DrawLine(p, 1, 1, 100, 100);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top