{"id":8386,"date":"2025-10-24T11:05:00","date_gmt":"2025-10-24T11:05:00","guid":{"rendered":"https:\/\/www.colorwave.it\/blog\/?p=8386"},"modified":"2025-10-24T11:18:40","modified_gmt":"2025-10-24T11:18:40","slug":"la-classe-wdg_dock_panel","status":"publish","type":"post","link":"https:\/\/www.colorwave.it\/blog\/framework\/la-classe-wdg_dock_panel\/admin\/2025\/10\/","title":{"rendered":"La classe Wdg_dock_panel"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"8386\" class=\"elementor elementor-8386\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-643ca2f e-flex e-con-boxed e-con e-parent\" data-id=\"643ca2f\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a51c948 elementor-widget elementor-widget-text-editor\" data-id=\"a51c948\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"it\">\n<head>\n    <meta charset=\"UTF-8\"\/>\n    <title>Gestione avanzata dei pannelli dockable MFC con ereditariet\u00e0 e cleanup personalizzato<\/title>\n    <style>\n        body { font-family: Arial, sans-serif; line-height: 1.6; margin: 2em; background: #f9f9f9; }\n        h1, h2, h3 { color: #2c3e50; }\n        code, pre { background: #f4f4f4; padding: 2px 6px; border-radius: 3px; }\n        pre { padding: 1em; }\n        .note { background: #eafaf1; border-left: 4px solid #27ae60; padding: 1em; margin: 1em 0; }\n    <\/style>\n<\/head>\n<body>\n    <h1>Gestione avanzata dei pannelli dockable MFC con ereditariet\u00e0 e cleanup personalizzato<\/h1>\n    <p>\n        In questo articolo viene illustrato come progettare una classe per la gestione dinamica di pannelli dockable in MFC, con particolare attenzione alla distruzione sicura, alla gestione della memoria e all\u2019estendibilit\u00e0 tramite ereditariet\u00e0. Il focus \u00e8 sulla classe <code>Wdg_dock_panel<\/code> e sull\u2019introduzione del metodo virtuale <code>CleanupResources()<\/code> per permettere alle classi derivate di gestire risorse specifiche.\n    <\/p>\n\n    <h2>Introduzione<\/h2>\n    <p>\n        La gestione dinamica dei pannelli dockable in MFC pu\u00f2 essere complessa, soprattutto quando si desidera garantire la corretta distruzione delle risorse e mantenere la coerenza delle strutture dati interne. Inoltre, in scenari reali, pu\u00f2 essere necessario estendere la classe base per aggiungere funzionalit\u00e0 o risorse specifiche, richiedendo un meccanismo flessibile per il cleanup.\n    <\/p>\n\n    <h2>Gestione della distruzione e della memoria<\/h2>\n    <p>\n        La classe <code>Wdg_dock_panel<\/code> gestisce la creazione e la distruzione dei pannelli tramite metodi statici (<code>CreatePanel<\/code>, <code>DestroyPanel<\/code>, <code>DestroyAllPanels<\/code>) e mantiene un vettore statico dei pannelli attivi. La distruzione avviene tramite <code>ShowPane(FALSE, FALSE, FALSE)<\/code> e <code>DestroyWindow()<\/code>, seguita dalla rimozione dal vettore e dalla chiamata a <code>delete<\/code> se necessario.\n    <\/p>\n    <pre><code>void Wdg_dock_panel::DestroyPanel(Wdg_dock_panel* pPanel)\n{\n    if (!pPanel) return;\n    auto it = std::find(s_dynamicPanels.begin(), s_dynamicPanels.end(), pPanel);\n    if (it != s_dynamicPanels.end())\n    {\n        pPanel->ShowPane(FALSE, FALSE, FALSE);\n        pPanel->DestroyWindow();\n        s_dynamicPanels.erase(it);\n        delete pPanel;\n    }\n}\n<\/code><\/pre>\n\n    <h2>Gestione della chiusura manuale e distruzione<\/h2>\n    <p>\n        Per gestire la chiusura tramite la X sulla barra del pannello, viene sovrascritto il metodo <code>OnClose()<\/code>, che rimuove il pannello dal vettore prima di chiamare la base:\n    <\/p>\n    <pre><code>void Wdg_dock_panel::OnClose()\n{\n    auto it = std::find(s_dynamicPanels.begin(), s_dynamicPanels.end(), this);\n    if (it != s_dynamicPanels.end())\n        s_dynamicPanels.erase(it);\n\n    CDockablePane::OnClose();\n}\n<\/code><\/pre>\n\n    <h2>Cleanup personalizzato tramite ereditariet\u00e0<\/h2>\n    <p>\n        Per permettere alle classi derivate di gestire risorse specifiche (buffer, handle, oggetti dinamici, ecc.), \u00e8 stato introdotto il metodo virtuale <code>CleanupResources()<\/code>, chiamato all\u2019interno di <code>OnDestroy()<\/code>:\n    <\/p>\n    <pre><code>\/\/ Nella classe base\nvirtual void CleanupResources() {}\n\nvoid Wdg_dock_panel::OnDestroy()\n{\n    CleanupResources();\n    CDockablePane::OnDestroy();\n}\n<\/code><\/pre>\n    <p>\n        Una classe derivata pu\u00f2 ridefinire <code>CleanupResources()<\/code> per liberare le proprie risorse:\n    <\/p>\n    <pre><code>class MyDockPanel : public Wdg_dock_panel {\npublic:\n    void CleanupResources() override {\n        \/\/ Cleanup specifico della classe derivata\n        \/\/ Esempio: delete m_pBuffer; m_pBuffer = nullptr;\n    }\n};\n<\/code><\/pre>\n\n    <div class=\"note\">\n        <strong>Nota:<\/strong> Il distruttore della classe base \u00e8 virtuale, garantendo la corretta distruzione anche tramite puntatore alla base.\n    <\/div>\n\n    <h2>Conclusioni<\/h2>\n    <p>\n        Questa architettura consente una gestione robusta e flessibile dei pannelli dockable in MFC, facilitando l\u2019estensione tramite ereditariet\u00e0 e garantendo la corretta liberazione delle risorse sia nella classe base che nelle derivate.\n    <\/p>\n    <p>\n        Se hai domande o vuoi approfondire altri aspetti della programmazione MFC, lascia un commento!\n    <\/p>\n<\/body>\n<\/html>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Gestione avanzata dei pannelli dockable MFC con ereditariet\u00e0 e cleanup personalizzato Gestione avanzata dei pannelli dockable MFC con ereditariet\u00e0 e cleanup personalizzato In questo articolo viene illustrato come progettare una classe per la gestione dinamica di pannelli dockable in MFC, con particolare&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":true,"template":"","format":"standard","meta":{"_acf_changed":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false,"jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[19],"tags":[],"jetpack_publicize_connections":[],"acf":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9rwsf-2bg","jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/8386"}],"collection":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/comments?post=8386"}],"version-history":[{"count":6,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/8386\/revisions"}],"predecessor-version":[{"id":8392,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/8386\/revisions\/8392"}],"wp:attachment":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/media?parent=8386"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/categories?post=8386"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/tags?post=8386"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}